我可以将以下语法中的 indent_loop [3] 替换为3 INDENT 的组吗? INDENT是缩进的词汇规则。
我只想根据数字编写 INDENT 的数量。
match_node
: match_node_name (tree_operator) (NEW_LINE (indent_loop[3]) ( moduleCall | literals ))*
{ match_node_list.push($match_node_name.text); }
| SINGLE_QUOTE POINTE SINGLE_QUOTE
;
match_node_name
: IDENT_SMALL_LETTERS
;
indent_loop[int scope]
: {scope == 3}? INDENT INDENT INDENT
| {scope == 4}? INDENT INDENT INDENT INDENT
;
INDENT : '\t';
当我这样做时,我无法回到我的通话规则而无法返回这组缩进? 意味着,(moduleCall | literals))*没有被调用。
我哪里错了?我刚开始。
或者还有其他办法吗?
答案 0 :(得分:1)
您可以使用语义谓词 1 :
来实现grammar T;
parse
: digit[1] digit[2] digit[3] EOF
;
digit[int amount]
: ({amount > 0}?=> DIGIT {amount--;})*
;
DIGIT
: '0'..'9'
;
使用从上面的语法生成的解析器解析"456789"
将导致以下解析:
请注意,在您的情况下,您只是匹配一个标签,不一定是缩进(即一行开头的一个或多个标签)。如果您只想匹配行开头的缩进,(IMHO)最简单的方法是在词法分析器 2 中处理它们。
1 What is a 'semantic predicate' in ANTLR?
2 ANTLR What is simpliest way to realize python like indent-depending grammar?