为自定义脚本编写antlr语法

时间:2012-05-04 10:43:55

标签: antlr antlr3

我正在使用antlr帮助从旧脚本引擎迁移到PHP。

用$包围的脚本变量。例如:$ 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规则中将所有与脚本无关的项目标记为原始输出?

    stmt
    :   varAtom
        |
        WHAT PLACE HERE???
        ;

1 个答案:

答案 0 :(得分:1)

尝试在所有其他词法规则的末尾添加以下词法规则

OTHER
 : .
 ;

然后将此词法规则添加到stmt规则:

stmt
 : varAtom
 | OTHER
 ;