antlr4语法非贪婪
antlr4 grammar non greedy
我正在尝试编写一个允许我在 if 语句中编写任何表达式的语法。
我的 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: '[';
概括,使用典型的陈述公式:
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/whitespace 敏感语言也是如此。通过隐藏,WS 仍然可以轻松访问计算缩进级别。而且,语法不会因为必须指定 SPACE*.
的每个可能的位置而受到污染
我正在尝试编写一个允许我在 if 语句中编写任何表达式的语法。
我的 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: '[';
概括,使用典型的陈述公式:
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/whitespace 敏感语言也是如此。通过隐藏,WS 仍然可以轻松访问计算缩进级别。而且,语法不会因为必须指定 SPACE*.
的每个可能的位置而受到污染