初次在项目中使用antlr,刚做了第一版,功能很简单(参不多正则都能做╮(╯▽╰)╭)
用antlr做表达式引擎,分析表达式变量和函数
举例:表达式为[a]+[b]>[c]*([d]+[e]) ,可以分析出[]中的变量
sum([a]+1000), 可以分析出变量,并得到函数名,进行运算,或是直接输出
这里有个antlr介绍的小:http://blackproof.iteye.com/blog/1807372
源码:https://github.com/dirkzhang/
留下一点对源码的笔记:
options {
output=AST;
ASTLabelType=CommonTree;
language=Java;
}
antlr分析输出为AST树
tokens
{
INDEX;
MEMBERACCESS;
CALL;
VARIABLE;
BRACKETEXP;
}
定义ast树上的节点,可以再rule中使用
methodExpr
: IDENTIFIER LPAREN (argument (COMMA argument)*)? RPAREN -> ^(CALL IDENTIFIER argument*)
;
给出一个函数的rule,表示遇到前边的翻译为CAll为根的树,如下
fragment Exponent
: ('e'|'E') INTEGER_LITERAL
;
fragment中的lexer是不能成为树节点的,可以被其他使用,相当于.g的全局变量
DATETIME_LITERAL
: '\'' STRING_LITERAL '\''
;
STRING_LITERAL
: '"' (~('"'|'['|']'))* '"'
;
IDENTIFIER
: LETTER (LETTER|Digit)*
;
这些是可以成为ast的node的lexer
贴一个antlr的工具antlrwork,很好用,可以网上搜搜