缩进嵌套列表的ANTLR语法

缩进嵌套列表的ANTLR语法,antlr,Antlr,我想知道是否有可能为分层缩进列表创建语法,如下所示: → a → b → b1 → b11 → b12 → b2 → b3 → c 哪些文本表示可以简化为: a b >b1 >>b11 >>b12 >b2 >b3 c 主要的问题是,我看不到一种保存和使用嵌套级别的方法。我尝试的是: grammar test; list: (item)+ ; item: NAME NL (sublist[1])*; sublist[int

我想知道是否有可能为分层缩进列表创建语法,如下所示:

→ a
→ b
  → b1
    → b11
    → b12
  → b2
  → b3
→ c
哪些文本表示可以简化为:

a
b
>b1
>>b11
>>b12
>b2
>b3
c
主要的问题是,我看不到一种保存和使用嵌套级别的方法。我尝试的是:

grammar test;
list: (item)+ ;
item: NAME NL (sublist[1])*;
sublist[int n]: (subitem[$n])+;
subitem[int n] locals [int i=1;]: ({$i <= $n}? ID {$i++;})+ NAME NL (sublist[$n+1])*;
NAME: [a-z0-9]+;
ID: '>';
NL: '\r' ? '\n';
WS : [ \t]+ -> skip;
语法测试;
清单:(项目)+;
项目名称:NL(子列表[1])*;
子列表[int n]:(子项[$n])+;
子项[int n]局部变量[int i=1;]:({$i跳过;
i、 e.使用ANTLR变量和语义谓词,但根据我所希望的-
({semantic predicate}?TERM)+
,根本不像我所期望的那样工作(它只需要触发一定的次数-消耗流),从而产生错误的结果

具体地说,在输入上有
>b12
,当使用
n=3
调用
子项时,此部分:


({$i您可以在Python语法中查找它是如何完成的。()主要思想是重新编写标记以合成IDENT/DEDENT对。谢谢,我来看看。我知道已经有indent/DEDENT(如HTML)的列表更容易解析。但是我不想在ANTLR之外使用任何类型的预处理,所以用它的方法重写对我来说非常有趣。你可以在Python语法中查看它是如何完成的。()主要的想法是重新编写标记来合成IDENT/DEDENT对。谢谢,我会看一看。我知道已经有indent/DEDENT的列表(比如HTML列表)更容易解析。但是我不想在ANTLR之外使用任何类型的预处理,所以用它的方法重写对我来说非常有趣。