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;
修改说明:
- 新增
primary规则,用来定义最基础的原子表达式——要么是数字,要么是括号包裹的完整表达式。 - 把原来的
factor规则改成只能是primary或者SUB primary,这样一元减号只能直接作用于原子表达式,无法嵌套,自然就禁止了连续减号的情况。 - 保留
term规则里的二元减号定义,不影响5-3这类正常减法运算;同时单个一元减号(比如-3)、带括号的一元减号(比如-(5+3))也能正常解析。
这样修改后,print --3;或print 5--3;这类输入会直接触发语法错误,符合你的需求,同时所有合法的基础数学运算都能正常工作。
内容的提问来源于stack exchange,提问作者Pedro Santos
相关产品推荐
相关产品推荐

