2012-05-04 30 views
1

我使用antlr幫助從舊腳本引擎遷移到PHP。爲自定義腳本編寫antlr語法

用$包圍的腳本變量。例如:$ myvar $。 腳本函數調用:$ func($ func2('bla-bla'),123)

這只是注入html沒有任何特定的字符。 例如:

<h1>$myvar$</h1> 

將顯示爲

<h1>Sergey</h1> 

我的語法如下:

grammar ScriptParser; 

options{ 
output = AST; 
ASTLabelType = CommonTree; 
} 

tokens{ 
FUNC_CALL; 
VAR; 
RAW_OUTPUT; 
} 

program : stmt* 
; 

stmt 
: varAtom 
    | 
    WHAT PLACE HERE??? 
    ; 

expr 
options{ 
    backtrack=true; 
    } 
    : orExpr 
; 

orExpr : andExpr (('or'|'||')^ andExpr)* 
; 

andExpr : equalityExpr (('and'|'&&')^ equalityExpr)* 
; 

equalityExpr 
    : comparisonExpr (('=='|'!='|'<>'|'=')^ comparisonExpr)* 
; 

comparisonExpr 
    : additiveExpr (('>'|'<'|'<='|'>=')^ additiveExpr)* 
; 

additiveExpr 
    : multiplicativeExpr (('+'|'-')^ multiplicativeExpr)* 
; 

multiplicativeExpr 
    : notExpr (('*'|'/')^ notExpr)* 
; 

notExpr 
    : (op='!'|'not')? negationExpr 
; 

negationExpr 
    : (op='-')? primary 
; 

primary : atom 
     |'(' expr ')' 
; 


atom : ID 
     | varAtom 
     | NUMBER 
     | HTML_SYMBOL 
     | stringAtom 
; 

varAtom : '$'ID'(' exprList ')' ->^(FUNC_CALL ID exprList?) 
     | '$'ID'$' ->^(VAR ID) 
; 


stringAtom 
    : DOUBLEQUOT! (ESC_SEQ | ~('\\'|DOUBLEQUOT))* DOUBLEQUOT! 
     | QUOT! (ESC_SEQ | ~('\\'|QUOT))* QUOT! 
    ; 

exprList: (expr (',' expr)*)? 
; 


//Begin Lexer 

ID : CHAR(LCHAR|DIGIT|CHAR)* 
; 
    fragment LCHAR 
    : CHAR|'_' 
; 
    fragment CHAR 
    : LC|UC 
; 
fragment LC 
    : 'a'..'z'|'а'..'я' 
    ; 
fragment UC 
    : 'A'..'Z'|'А'..'Я' 
; 

HTML_SYMBOL 
    : '&'LC*';' 
    ; 

fragment ESC_SEQ 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
; 
QUOT : '\'' 
; 
DOUBLEQUOT : '"' 
; 


NUMBER : INT | FLOAT 
; 

fragment INT : '0'|('1'..'9' DIGIT*) 
; 
fragment FLOAT : INT('.' DIGIT*) 
; 

fragment DIGIT 
    : '0'..'9' 
; 

我應該在語句規則的地方標記所有不腳本相關的項目爲原料輸出?

stmt 
    : varAtom 
     | 
     WHAT PLACE HERE??? 
     ; 

回答

1

嘗試所有其他詞法分析器的末尾添加下面的詞法規則規則

OTHER 
: . 
; 

,然後添加此詞法規則您stmt規則:

stmt 
: varAtom 
| OTHER 
;