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

ANTLR 4:如何正确处理一元负运算符,禁止连续减号输入

解决ANTLR4语法中连续减号的问题

你的问题根源在于factor规则里的递归定义:SUB factor允许无限嵌套一元减号,才会出现--3或5--3这类连续减号的情况。之前你修改的版本只允许减号跟数字,忽略了括号表达式的合法场景,所以导致其他输入失效。

下面是修改后的完整语法,既能禁止连续减号,又能保留所有合法运算:

grammar mar ;

start
  : expression+ EOF
  ;

expression
  : PRINT context SEMI               # PrintExpr
  ;

context : factor term
  ;

term
  : MUL factor term                  # Mul
  | DIV factor term                  # Div
  | ADD factor term                  # Add
  | SUB factor term                  # Sub
  |                                  # Empty
  ;

// 拆分factor和primary,避免一元减号递归嵌套
factor
  : primary                          # PrimaryFactor
  | SUB primary                      # Neg
  ;

// primary代表最基础的原子表达式
primary
  : LPAREN context RPAREN            # Paren
  | DOUBLE                           # DOUBLE
  ;

DOUBLE : [0-9]+('.'[0-9]+)? ;

PRINT  : 'print ' ;
SEMI   : ';' ;
ADD    : '+' ;
SUB    : '-' ;
MUL    : '*' ;
DIV    : '/' ;
LPAREN : '(' ;
RPAREN : ')' ;

WS: [ \t\r\n]+ -> skip;

修改说明:

  1. 新增primary规则,用来定义最基础的原子表达式——要么是数字,要么是括号包裹的完整表达式。
  2. 把原来的factor规则改成只能是primary或者SUB primary,这样一元减号只能直接作用于原子表达式,无法嵌套,自然就禁止了连续减号的情况。
  3. 保留term规则里的二元减号定义,不影响5-3这类正常减法运算;同时单个一元减号(比如-3)、带括号的一元减号(比如-(5+3))也能正常解析。

这样修改后,print --3;或print 5--3;这类输入会直接触发语法错误,符合你的需求,同时所有合法的基础数学运算都能正常工作。

内容的提问来源于stack exchange,提问作者Pedro Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:02:53