2010-08-14 3 views
3

4Test 스크립트를 Perl로 변환하고 싶습니다. 필자는 Perse에서 Parse :: RecDescent를 사용했지만 아직 작업에 압도 당하고있다. 다음은 그 예입니다.4Test에서 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); 
     ... 
} 
... 이 내 구문 분석 :: 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가 처리 할 수 ​​있다고 생각하는지 여부입니다. 나는 그것을 묻습니다. 아니면 단순한 (복잡한) 정규 표현식으로 충분합니까? 나는 누군가가 이것에 제안 할 수 있던 무엇을 감사 할 것입니다.

+2

Regexp :: Grammars를 보셨습니까? – Schwern

+0

4test에 대한 완전한 통역이 필요합니까 아니면 몇 가지 스크립트 만 변환 하시겠습니까? – jjmerelo

답변

0

모든 연산자 식을 서브 루틴 호출로 대체하여 4Test 스크립트를 단순화하는 것이 좋습니다. 그런 다음 여전히 4Test 스크립트로 실행할 수 있기 때문에 효과가 있음을 증명할 수 있지만 파싱 문제를 크게 단순화 할 수 있습니다. 연산자 표현식은 직접적인 프로 시저 호출보다 구문 분석하기가 훨씬 어렵습니다. 이 프로세스는 Perl이 직접 실행할 수있는 4Test 스크립트와 4Test 함수의 일부 대체 루틴을 생성합니다.