Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTLR ActionScript到Java问题_Antlr - Fatal编程技术网

ANTLR ActionScript到Java问题

ANTLR ActionScript到Java问题,antlr,Antlr,真希望有人能帮上忙。我一直在使用Robert Stehwien的ANTLR脚本为类似excel的公式创建AST 当作为ActionScript运行时,生成的代码看起来不错,但当我移植到Java时,我发现了一个有趣的小问题 以下公式的树是“+”而不是“(+12)”。这是我能找到的最简单的情况,但是其他公式也无法创建正确的树 (1+2) 但是,以下方法可以很好地工作: 1+2 你知道这是什么原因吗?非常感谢 很抱歉下面的代码转储,我不知道如何才能简单地解释这个问题。下面是我用来拉出树字符串的代码:

真希望有人能帮上忙。我一直在使用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
    ;