Antlr4语法围绕字符串可选括号

时间:2016-10-01 23:45:23

标签: regex parsing antlr antlr4

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

  1. (NOT str1匹配'hello')
  2. NOT(str1匹配'hello')
  3. (NOT(str1匹配'hello'))
  4. NOT str1匹配'hello'
  5. 在我的规则中,我有

    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. 条款中最多只有一个。
    3. 任何有关如何为这些规则编写语法的帮助都会非常有用。

      提前致谢!

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

因此,(NOT (str1 matches 'hello'))将与

匹配

parenExpression - > notExpression - > parenExpression - > comparatorExpression

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