Antlr 输入匹配解析规则和词法分析器

问题描述 投票:0回答:1

我正在尝试编写一个语法来解析算术表达式。

当我尝试添加对一元减 (-) 的支持时,我面临以下问题:

仅当我在之间留有空格时,输入才会匹配,例如 - 10。

如果输入为 -10,则它与单词匹配,因为它也是有效的词法分析器。

如何更改语法,以便可以使用没有空格的一元运算符。

grammar Arithmetic;

parse
 : expression EOF
 ;

expression
 : op=SUBTRACT exp=expression
 | left=expression op= EXPONENT right=expression
 | left=expression op= DIVIDE right=expression
 | left=expression op= MULTIPLY right=expression
 | left=expression op= MODULUS right=expression
 | left=expression op= ADD right=expression
 | left=expression op= SUBTRACT right=expression
 | INTEGER
 | WORD
 ;

ADD          : '+';
SUBTRACT     : '-' ;
MULTIPLY     : '*' ;
DIVIDE       : '/' ;
MODULUS      : '%' ;
EXPONENT     : '^' ;
INTEGER      : [0-9]+;
WORD         : (ALPHANUMERIC | '_' | '-' | '.' | SQ | DQ)+;
WS           : [ \r\t\u000C\n]+ -> skip;
ALPHANUMERIC : [a-zA-Z0-9];
SQ           : '\''.*? '\'';
DQ           : '"'.*? '"';

parsing antlr antlr4
1个回答
0
投票

如果输入为 -10,则它与单词匹配,因为它也是有效的词法分析器。

如何更改语法以便可以使用没有空格的一元运算符。

那是不可能的。您需要更改与

Word
匹配的词法分析器规则。 ANTLR 的词法分析器以非常可预测的方式工作(无论解析器试图匹配什么):

  1. 找到消耗最多字符的词法分析器规则
  2. 如果 2 个(或更多)词法分析器规则匹配相同的字符,则让第一个定义的规则“获胜”

因此,这清楚地表明

-10
将始终成为
Word
代币。没有办法绕过它。

© www.soinside.com 2019 - 2024. All rights reserved.