Antlr4 语法可选括号括起字符串

Antlr4 grammar optional brackets around string

我正在尝试编写一个语法来计算一个方程式,该方程式可能被括号括起来,也可能不被括号括起来。前-

  1. (不匹配 str1 'hello')
  2. 不(str1 匹配 'hello')
  3. (不(str1 匹配 'hello'))
  4. 不匹配 str1 'hello'

在我的规则中,我有

clause
: expression EOF
;

expression
 :
   LPAREN expression RPAREN                            #parenExpression
 | isNumeric                                     #isNumericExpression
 | leftSide IS NOT? NULL                               #nullExpression
 | compare                                           #comparatorExpression
 | NOT                                                 #notExpression

;


compare : NOT? LPAREN? NOT? leftSide op=comparator rightSide RPAREN? ;

现在,这有几个问题。

  1. 我不检查左右括号是否匹配。
  2. 子句中最多有一个NOT。

任何有关如何为这些规则编写语法的帮助都将非常有帮助。

提前致谢!

从概念上讲,表达式(通常)要么是复杂的,,要么是递归的,要么是简单的:

expression
   : LPAREN expression RPAREN                 #parenExpression
   | NOT expression                           #notExpression
   | simpleExpression                         
   ;

simpleExpression
   : isNumeric                                #isNumericExpression
   | leftSide IS NOT? NULL                    #nullExpression
   | leftSide op rightSide                    #comparatorExpression
   ;

第一个复杂的 alt 允许在表达式周围使用任何级别的平衡括号。第二个允许一个或多个 NOTs 在任何表达式之前。

简单的 alts 表示表达式的最基本形式。

因此,(NOT (str1 matches 'hello')) 将匹配

parenExpression -> notExpression -> parenExpression -> comparatorExpression.

当然,这两个规则可以合二为一。