Antlr4 树解析器我对 (9-34)*9 这样的数字有问题
Antlr4 tree parser I have problems with numbers like (9-34)*9
我创建了一棵树 antlr4.The 树执行计算步骤,对于 +、-.、* 和 /。这棵树非常适合正数,我的问题是,对于负数,比如当我输入 (9-40)*10 左右时,它不再起作用了。
我的代码是:
calculator:
(d)*| ;
c:
c '*' c | c '/' c | c '+' c | c '-' c | '(' c ')' | b | a ;
d:
a '=' c ;
b : '-'?[0-9]+;
a: [a-zA-Z][a-zA-Z0-9]*;
WS : [ \t\r\n]+ -> skip ;
(请在 post 之前小心验证您的来源。posted 的语法不是有效的 ANTLR。可能是因为您将规则名称更改为 a
, b
, 等等,忘记保持 Lexer 规则大写。)
如果我认为是这种情况,这里有一个修改后的语法来解决您的问题。
grammar calc
;
calculator: (d)*;
c
: c '*' c
| c '/' c
| c '+' c
| c '-' c
| '(' c ')'
| '-'? NBR // <-- The fix
| ID
;
d: ID '=' c;
NBR: [0-9]+; // <-- removed the '-'?
ID: [a-zA-Z][a-zA-Z0-9]*;
WS: [ \t\r\n]+ -> skip;
问题的根源在于,通过将 -
放入 Lexer 规则中,ANTLR 会将“-40”匹配为 NBR 标记,因为它的字符串比“40”长.解决方案是将否定作为 c(又名表达式)
的解析器规则中的替代方法来处理
使用 ANTLR 工具(又名 grun
)和 -tokens
选项来获取令牌流的转储总是一个好主意,以确保您的 Lexer 规则为解析器提供它需要的令牌流。
我创建了一棵树 antlr4.The 树执行计算步骤,对于 +、-.、* 和 /。这棵树非常适合正数,我的问题是,对于负数,比如当我输入 (9-40)*10 左右时,它不再起作用了。
我的代码是:
calculator:
(d)*| ;
c:
c '*' c | c '/' c | c '+' c | c '-' c | '(' c ')' | b | a ;
d:
a '=' c ;
b : '-'?[0-9]+;
a: [a-zA-Z][a-zA-Z0-9]*;
WS : [ \t\r\n]+ -> skip ;
(请在 post 之前小心验证您的来源。posted 的语法不是有效的 ANTLR。可能是因为您将规则名称更改为 a
, b
, 等等,忘记保持 Lexer 规则大写。)
如果我认为是这种情况,这里有一个修改后的语法来解决您的问题。
grammar calc
;
calculator: (d)*;
c
: c '*' c
| c '/' c
| c '+' c
| c '-' c
| '(' c ')'
| '-'? NBR // <-- The fix
| ID
;
d: ID '=' c;
NBR: [0-9]+; // <-- removed the '-'?
ID: [a-zA-Z][a-zA-Z0-9]*;
WS: [ \t\r\n]+ -> skip;
问题的根源在于,通过将 -
放入 Lexer 规则中,ANTLR 会将“-40”匹配为 NBR 标记,因为它的字符串比“40”长.解决方案是将否定作为 c(又名表达式)
使用 ANTLR 工具(又名 grun
)和 -tokens
选项来获取令牌流的转储总是一个好主意,以确保您的 Lexer 规则为解析器提供它需要的令牌流。