- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似于在线教程中的数学表达式语法文件:http://javadude.com/articles/antlr3xtut/
但是现在我想为函数添加选项,但我很难让词法分析器/解析器规则正常工作。我可以使用丑陋的词法分析器规则来使代码正常工作,但我想使用更干净的标记来使解析器规则正常工作。
如果我尝试这样做,对于像 'a*b/13.2*Test(3,2)' 这样的表达式,我会在输入 'Test('"时捕获“第 1:9 行没有可行的替代方案”异常
请检查以下语法文件中的注释以了解我的确切问题是什么
grammar ExpressionOnly;
options {
language = Java;
}
@header {
package kic.engine.grammar;
}
@lexer::header {
package kic.engine.grammar;
}
// Top Rule
eval
: expression
;
term
: func
| '(' op1=expression ')'
| array
| element
;
// Sub Terms
func
// : f=FUNC // Works but this is very ugly because FUNC contains '(';
: f=IDENT '(' // <---------------------------- why does this not work: line 1:9 no viable alternative at input 'Test('
(arg=expression (',' arg=expression)*)?
')'
;
array
: '[' ele=element (',' ele=element)* ']'
;
element
: b=(K_TRUE | K_FALSE)
| NUMBER
| IDENT
| DATE
| SQ_STRING
| K_NULL
;
negation
@init{ boolean negate = false; }
: (K_NOT | '!' { negate = true;} )?
term
;
unary
@init{ boolean positive = true; }
: ('+' | '-')*
negation
;
power
: op1=unary
( '^' op2=unary
)*
;
multiply
: op1=power
( '*' op2=power
| '/' op2=power
| '%' op2=power
)*
;
add
: op1=multiply
( '+' op2=multiply
| '-' op2=multiply
)*
;
relation
: op1=add
( '=' op2=add
| '!=' op2=add
| '<' op2=add
| '<=' op2=add
| '>' op2=add
| '>=' op2=add
)*
;
expression
: op1=relation
( (K_AND | '&') op2=relation
| (K_OR | '|') op2=relation
)*
;
// Case-insensitive alpha characters
fragment A: ('a'|'A');
fragment B: ('b'|'B');
fragment C: ('c'|'C');
fragment D: ('d'|'D');
fragment E: ('e'|'E');
fragment F: ('f'|'F');
fragment G: ('g'|'G');
fragment H: ('h'|'H');
fragment I: ('i'|'I');
fragment J: ('j'|'J');
fragment K: ('k'|'K');
fragment L: ('l'|'L');
fragment M: ('m'|'M');
fragment N: ('n'|'N');
fragment O: ('o'|'O');
fragment P: ('p'|'P');
fragment Q: ('q'|'Q');
fragment R: ('r'|'R');
fragment S: ('s'|'S');
fragment T: ('t'|'T');
fragment U: ('u'|'U');
fragment V: ('v'|'V');
fragment W: ('w'|'W');
fragment X: ('x'|'X');
fragment Y: ('y'|'Y');
fragment Z: ('z'|'Z');
// Fragments
fragment DIGIT : '0' .. '9';
fragment UPPER : 'A' .. 'Z';
fragment LOWER : 'a' .. 'z';
fragment LETTER : LOWER | UPPER;
fragment WORD : LETTER | '_' | '$' | '#' | '.';
fragment ALPHANUM : WORD | DIGIT;
fragment ESCAPE[StringBuilder buf] :
'\\'
( 't' { buf.append('\t'); }
| 'n' { buf.append('\n'); }
| 'r' { buf.append('\r'); }
| '"' { buf.append('\"'); }
| '\\' { buf.append('\\'); }
)
;
// Keyowords
K_FALSE : F A L S E;
K_NULL : N U L L;
K_TRUE : T R U E;
K_AND : A N D;
K_NOT : N O T;
K_OR : O R;
// Tokens;
FUNC : LETTER+ '(';
IDENT : LETTER ALPHANUM*;
ARRAY_INDEX : IDENT '[';
DQ_STRING
@init { final StringBuilder buf = new StringBuilder(); }
: '"'
( ESCAPE[buf]
| i = ~('\\' | '"') { buf.appendCodePoint(i); }
)*
{ setText(buf.toString()); }
;
NUMBER: DIGIT+ ('.' DIGIT+)? (('e'|'E')('+'|'-')? DIGIT+)?;
DATE: '\'' DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT (' ' DIGIT DIGIT ':' DIGIT DIGIT ':' DIGIT DIGIT ('.' DIGIT+)?)? '\'';
SQ_STRING : '\'' .* '\'';
// hidden tokens
WS : (' ' | '\t' | '\r' | '\n')+ {$channel=HIDDEN;};
COMMENTS : '/*' .* '*/' {$channel=HIDDEN;};
最佳答案
输入 Test(3,2)
变成以下 token :
[FUNC : Test(] [NUMBER : 3] [',' : ,] [NUMBER : 2] [')' : )]
FUNC
token ,所以解析器产生一个错误,打印 token 的内容:
line 2:1 no viable alternative at input 'Test('
.
FUNC
词法分析器规则,重新生成所有内容,然后重新运行。现在相同的输入产生这些标记没有错误:
[IDENT : Test] ['(' : (] [NUMBER : 3] [',' : ,] [NUMBER : 2] [')' : )]
f=IDENT
在解析器规则中
func
至
f=IDENT^
, 以便更容易地在 AST 中查看解析器是否识别出一个函数。
a*b/13.2*Test(3,2)
我得到以下 AST:
Test(3,2)
被正确识别为函数,并相应地生成 AST。
关于antlr - 另一个没有可行的替代方案...,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031966/
对于我的一个项目,我终于需要使用我的第一个多态类(std::cout 除外)。 我正在研究如何确保至少在某些情况下我有 100% 的去虚拟化调用。 这段代码是否合法可行? dynamic_cast 有
最近有一个编译问题,用这个片段说明: struct Base { }; template struct A : Base { A(){} A(Base&&) {} }; A foo()
注意:这是一个冗长的问题,需要对 MVVM“设计模式”、JSON 和 jQuery 有很好的理解.... 所以我有一个理论/主张 DHTML 中的 MVVM 是可能的 和可行的 并且想知道您是否同意/
我有一台 Mac 服务器,我正在构建 PHP 代码以允许用户上传图像、文档甚至视频文件。研究这个肯定让我很紧张,我希望上传的内容没有病毒。 自己构建一些东西会是一个巨大的挑战吗?您会这样做,还是会
根据文档,ASP.NET 项目(尚)不支持新的 PackageReference https://learn.microsoft.com/en-us/nuget/consume-packages/pa
我是一名优秀的程序员,十分优秀!