我正在使用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???
;
答案 0 :(得分:1)
尝试在所有其他词法规则的末尾添加以下词法规则:
OTHER
: .
;
然后将此词法规则添加到stmt
规则:
stmt
: varAtom
| OTHER
;