antlr4语法非贪婪

时间:2016-10-06 18:46:44

标签: python antlr4

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

我的if语句如下所示: 如果[x == 1] [做一些事情]

该表达式应该是任何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: '[';

1 个答案:

答案 0 :(得分:1)

广义,使用典型的陈述公式:

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规则将通过递归处理可选和嵌套括号的出现。

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