You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:08:12