ANTLR ActionScript到Java问题
真希望有人能帮上忙。我一直在使用Robert Stehwien的ANTLR脚本为类似excel的公式创建AST 当作为ActionScript运行时,生成的代码看起来不错,但当我移植到Java时,我发现了一个有趣的小问题 以下公式的树是“+”而不是“(+12)”。这是我能找到的最简单的情况,但是其他公式也无法创建正确的树 (1+2) 但是,以下方法可以很好地工作: 1+2 你知道这是什么原因吗?非常感谢 很抱歉下面的代码转储,我不知道如何才能简单地解释这个问题。下面是我用来拉出树字符串的代码:ANTLR ActionScript到Java问题,antlr,Antlr,真希望有人能帮上忙。我一直在使用Robert Stehwien的ANTLR脚本为类似excel的公式创建AST 当作为ActionScript运行时,生成的代码看起来不错,但当我移植到Java时,我发现了一个有趣的小问题 以下公式的树是“+”而不是“(+12)”。这是我能找到的最简单的情况,但是其他公式也无法创建正确的树 (1+2) 但是,以下方法可以很好地工作: 1+2 你知道这是什么原因吗?非常感谢 很抱歉下面的代码转储,我不知道如何才能简单地解释这个问题。下面是我用来拉出树字符串的代码:
ANTLRStringStream input = new ANTLRStringStream("(1 + 2)");
FormulaLexer lexer = new FormulaLexer(input);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
FormulaParser parser = new FormulaParser(tokenStream);
ParserRuleReturnScope scope = parser.formula();
CommonTree expressionTree = (CommonTree) scope.getTree();
System.out.println(expressionTree.toStringTree());
这是最后一个ANTLR脚本。这与原始版本几乎相同,删除了ActionScript选项:
/*
Originally written by Robert Stehwien
*/
grammar Formula;
options {
output=AST;
ASTLabelType=CommonTree;
}
tokens {
POS;
NEG;
CALL;
}
@package {com.arcanearcade.antlr}
@lexer::package {com.arcanearcade.antlr}
formula
: (EQ!)? expression
;
//The highest precedence expression is the most deeply nested
//Precedence ties are parsed left to right
//Expression starts with the lowest precedece rule
expression
: boolExpr
;
boolExpr
: concatExpr ((AND | OR | LT | LTEQ | GT | GTEQ | EQ | NOTEQ)^ concatExpr)*
;
concatExpr
: sumExpr (CONCAT^ sumExpr)*
;
sumExpr
: productExpr ((SUB | ADD)^ productExpr)*
;
productExpr
: expExpr ((DIV | MULT)^ expExpr)*
;
expExpr
: unaryOperation (EXP^ unaryOperation)*
;
unaryOperation
: NOT^ operand
| ADD o=operand -> ^(POS $o)
| SUB o=operand -> ^(NEG $o)
| operand
;
// the highest precedence rule uses operand
operand
: literal
| functionExpr -> ^(CALL functionExpr)
| percent
| VARIABLE
| LPAREN expression RPAREN -> ^(expression)
;
functionExpr
: FUNCNAME LPAREN! (expression (COMMA! expression)*)? RPAREN!
;
literal
: NUMBER
| STRING
| TRUE
| FALSE
;
percent
: NUMBER PERCENT^
;
STRING
:
'\"'
( options {greedy=false;}
: ESCAPE_SEQUENCE
| ~'\\'
)*
'\"'
;
WHITESPACE
: (' ' | '\n' | '\t' | '\r')+ {skip();};
TRUE
: ('t'|'T')('r'|'R')('u'|'U')('e'|'E')
;
FALSE
: ('f'|'F')('a'|'A')('l'|'L')('s'|'S')('e'|'E')
;
NOTEQ : '<>';
LTEQ : '<=';
GTEQ : '>=';
AND : '&&';
OR : '||';
NOT : '!';
EQ : '=';
LT : '<';
GT : '>';
EXP : '^';
MULT : '*';
DIV : '/';
ADD : '+';
SUB : '-';
CONCAT : '&';
LPAREN : '(';
RPAREN : ')';
COMMA : ',';
PERCENT : '%';
VARIABLE
: '[' ~('[' | ']')+ ']'
;
FUNCNAME
: (LETTER)+
;
NUMBER
: (DIGIT)+ ('.' (DIGIT)+)?
;
fragment
LETTER
: ('a'..'z') | ('A'..'Z')
;
fragment
DIGIT
: ('0'..'9')
;
fragment
ESCAPE_SEQUENCE
: '\\' 't'
| '\\' 'n'
| '\\' '\"'
| '\\' '\''
| '\\' '\\'
;
/*
最初由罗伯特·斯特温撰写
*/
语法公式;
选择权{
输出=AST;
ASTLabelType=CommonTree;
}
代币{
销售时点情报系统;
阴性;
呼叫
}
@包{com.arcanearcade.antlr}
@lexer::包{com.arcanearcade.antlr}
公式
:(情商!)?表达
;
//最高优先级的表达式是嵌套最深的表达式
//优先关系从左到右解析
//表达式以最低优先级规则开头
表情
:boolExpr
;
博莱克斯普
:concatExpr((和|或| LT | LTEQ | GT | GTEQ | EQ | NOTEQ)^concatExpr)*
;
concatExpr
:sumExpr(CONCAT^sumExpr)*
;
苏美普
:productExpr((子|添加)^productExpr)*
;
productExpr
:expexpexpr((DIV | MULT)^expexpexpr)*
;
expexpxpr
:unaryOperation(EXP^unaryOperation)*
;
一元运算
:非^操作数
|添加o=操作数->^(位置$o)
|子o=操作数->^(负$o)
|操作数
;
//最高优先级规则使用操作数
操作数
:文字
|functionExpr->^(调用functionExpr)
|百分比
|变数
|LPAREN表达式RPAREN->^(表达式)
;
函数表达式
:FUNCNAME LPAREN!(表达式(逗号!表达式)*)?阿伦!
;
字面意义的
:号码
|串
|真的
|假的
;
百分比
:百分比^
;
一串
:
'\"'
(选项{greedy=false;}
:逃逸序列
| ~'\\'
)*
'\"'
;
空白
:(“”|’\n’|’\t’|’\r’+{skip();};
真的
:('t''t')('r''r')('u''u')('e''e'))
;
错误的
:('f''f')('a''a')('l''l')('s''s')('e''e'))
;
注:'';
LTEQ:“=”;
及:"&";
或:“| |”;
不是:“!”;
等式:'=';
LT:'';
EXP:“^”;
MULT:“*”;
分区:“/”;
加:“+”;
SUB:“-”;
"和",;
LPAREN:'(';
RPAREN:')';
逗号:',';
百分比:“”;
变量
: '[' ~('[' | ']')+ ']'
;
函数名
:(信)+
;
数
:(数字)+('。。(数字)+)?
;
片段
书信
:('a'..'z')|('a'..'z'))
;
片段
数字
: ('0'..'9')
;
片段
逃逸序列
:“\\”t'
|“\\”“n”
| '\\' '\"'
| '\\' '\''
| '\\' '\\'
;
始终确保任何AST的根是单个(唯一)令牌(不是解析器规则),并且在重写单个解析器规则的情况下,不要执行..->^(单个解析器规则)
,只需执行:..->single\u parser\u规则
因此,在您的情况下,在操作数
规则中,将->^(表达式)
更改为->表达式
:
operand
: literal
| functionExpr -> ^(CALL functionExpr)
| percent
| VARIABLE
| LPAREN expression RPAREN -> expression
;
始终确保任何AST的根是单个(唯一)令牌(不是解析器规则),并且在重写单个解析器规则的情况下,不要执行
..->^(单个解析器规则)
,而只需执行:..->单个解析器规则
因此,在您的情况下,在操作数
规则中,将->^(表达式)
更改为->表达式
:
operand
: literal
| functionExpr -> ^(CALL functionExpr)
| percent
| VARIABLE
| LPAREN expression RPAREN -> expression
;