Разбор и преобразование 4Test в Perl - PullRequest
3 голосов
/ 14 августа 2010

Я хочу конвертировать скрипты 4Test в Perl. Я использую Parse :: RecDescent в Perl, но все еще перегружен этой задачей. Вот пример.

Примером 4Test является что-то вроде:

ParseSMSPlans (STRING sDir)
{
STRING sFile;
STRING sDirSMSPlan = sDir + "sms_plans\";
STRING sDirPlan = sDir + "plan\";
STRING sDirDeal = sDir + "deal\";
STRING sDirProduct = sDir + "product\";
STRING sLine, sType, sName;
HFILE hIn;
FILEINFO fiFile;
LIST OF FILEINFO lfInfo = SYS_GetDirContents (sDirSMSPlan);
       ...
}

... Это мой Parse :: RecDescent грамматика

my $grammar = q{

#-----------------identifiers and datatypes-------------------#

    identifier : /[a-z]\w+/
    binops : '+' | '-' | '/' | '*' | '%' | '**'
    lbinops: '!' | '<' | '>' | '>='| '<='| '&&'| '||' | '=='
    integer: /\d+/ {print "hello $item[-1]" if $::debugging;}
    number : /(\d+|\d*\.\d+)/ {print "hello $item[-1]" if $::debugging;}
    string : /"(([^"]*)(\\")?)*"/
    operation : number binops number operation(s?)
    datatype : /[a-zA-Z]\w*/
    definition : datatype expression(s) #{print "hello $item[-1]" if $::debugging;}
                |datatype expression(s) "=" expression(s) #{print "hello $item[-1] = $item[-2]" if $::debugging;}
    statement : ifexp | elsexp | elseifexp |forexp | feachexp | whexp | swcexp


#------------------Expressed Values-----------------------------#
    program : expression
    expression :  number {print $item[1] if $::debugging}
                | integer
                | assignment
                | operation
                | identifier binops expression
                | number binops expression

#------------------Conditionals---------------------------------------#

    ifexp  : 'if' '(' expression(s) ')' '{' expression(s) '}' elsexp(?)
    elsexp : 'else' '{' expression(s) '}'
    elseifexp: 'else' 'if' '(' expression(s) ')' '{' expression(s) '}'
    forexp : 'for' '(' expression ';' expression ';' expression ')' '{' expression(s)  }'
           | 'for' assignment 'to' number expression(s) | 'for' assignment 'to' number '{' expression(s) '}'
    feachexp : 'for each' expression 'in' expression '{' expression(s) '}'
    whexp  : 'while' '(' expression ')' '{' expression(s) '}'
    casest : 'case' expression(s /,/) ':'
    swcexp : 'switch' identifier '{' casest(s) '}' expression(s) 'default'
    assignment : identifier(s) '=' expression
};

Итак, я смотрю на добавление «$» к каждому имени переменной и нарезку типы данных. По большей части моя грамматика работает, хотя я полностью проверил это еще, но только потому, что Parse :: RecDescent был немного мне сложно понять, и я не совсем уверен, что это лучший способ выполнить мою задачу ... или самый быстрый, если на то пошло.

Моя главная проблема - чувствует ли кто-либо, что PRD может справиться с чем Я прошу это сделать или будет достаточно простого (сложного) регулярного выражения? я мог бы ценим любую помощь, которую кто-либо может предложить по этому вопросу.

1 Ответ

0 голосов
/ 06 октября 2012

Могу ли я предложить вам упростить сценарии 4Test, заменив все выражения операторов вызовами подпрограмм.Тогда вы все равно сможете запускать их как сценарии 4Test и, таким образом, доказать, что они работают, но вы значительно упростите задачу синтаксического анализа - синтаксический анализ выражений оператора гораздо сложнее, чем прямой вызов процедуры.В пределе, этот процесс создаст сценарии 4Test, которые почти могут быть запущены непосредственно Perl + некоторые процедуры замены для функций 4Test.

...