Antlr4语法不贪婪



我想写一个语法,允许我在if语句中写任何表达式。

我的if语句将像下面这样:if [x == 1] [Do some stuff]

表达式应该是任何Python表达式。

如果我像下面这样使用非贪婪匹配,我如何指定'['或']'作为表达式的一部分?列表理解是我语法上的一个问题。

ifval
  : (SPACE)* IF (SPACE|WORD)* SQRLBRACE .*? SQRRBRACE (WORD|SPACE)* <blah> <blah>;
WORD     : ('a'..'z' | 'A'..'Z'| '_' | '-')+;
NUM      : [0-9];
NEWLINE  : 'r'? 'n' | 'r';
SPACE    : (' ' | 't') ;
SQRRBRACE: ']';
SQRLBRACE: '[';

泛化,使用一个典型的语句公式:

stmt   : ifval
       | ....
       ;
ifval  : IF expr body ;
expr   : LBRACK expr? RBRACK
       | NOT expr 
       | WORD ( LBRACK WORD? RBRACK )? // value or array[idx]
       | ....
       ;
body   : WORD
       | LBRACE stmt* RBRACE
       | .... 
       ;

expr规则将通过递归处理可选括号和嵌套括号的出现。

顺便说一句,隐藏语法中的空白几乎总是更好的,即使对于Python/空白敏感的语言也是如此。通过隐藏,WS仍然可以很容易地访问计算缩进级别。而且,语法不会因为必须指定SPACE*的每个可能位置而受到污染。

相关内容

  • 没有找到相关文章

最新更新