Antlr语法问题:一元减号(-)无空格时匹配Lexer规则而非解析规则
解决一元减号与WORD规则冲突的问题
问题根源在于ANTLR的Lexer遵循最长匹配原则,你的WORD规则允许包含'-'和数字,所以-10会被匹配为一个完整的WORD(长度3),而非单独的SUBTRACT(长度1)加INTEGER。要解决这个问题,需要从Lexer规则和语法逻辑两方面调整:
1. 调整WORD的Lexer规则
算术表达式中,'-'作为运算符时不应被纳入变量名前缀,因此修改WORD规则,限制其必须以字母或下划线开头,避免与一元减号冲突:
grammar Arithmetic; parse : expression EOF ; // 一元减号规则放在最前面,确保优先级最高 expression : op=SUBTRACT exp=expression | left=expression op=EXPONENT right=expression | left=expression op=(MULTIPLY | DIVIDE | MODULUS) right=expression | left=expression op=(ADD | SUBTRACT) right=expression | INTEGER | WORD | STRING ; // 运算符规则保持不变 ADD : '+'; SUBTRACT : '-' ; MULTIPLY : '*' ; DIVIDE : '/' ; MODULUS : '%' ; EXPONENT : '^' ; INTEGER : [0-9]+; // 修改WORD规则:必须以字母/下划线开头,后续可跟字母、数字、下划线、'-'、'.' WORD : [a-zA-Z_] [a-zA-Z0-9_\\-\\.]*; // 单独拆分带引号的字符串规则,语义更清晰 STRING : '\'' .*? '\'' | '"' .*? '"'; WS : [ \r\t\u000C\n]+ -> skip;
2. 优化Parser规则(可选)
将同优先级的运算符合并,让语法结构更简洁(比如乘除模优先级一致,加减优先级一致),同时保证一元减号的优先级始终最高(规则顶部位置)。
效果验证
- 输入
-10:被解析为SUBTRACT+INTEGER,匹配一元减号规则 - 输入
- 10:空格被跳过,同样匹配一元减号规则 - 输入
10-20:正常匹配二元减号规则 - 输入
--5:匹配嵌套一元减号,解析为-(-5) - 输入
-var123:解析为一元减号加变量var123 - 输入
my-var:被识别为合法的WORD变量名
内容的提问来源于stack exchange,提问作者Sidhant
相关产品推荐
相关产品推荐

