如何跳过解析器规则的无用节点



我有一个简单的Antlr4语法:

grammar: test;
expression: 
    IF LPAREN logical ',' otherrule',' otherrule RPAREN # myExpression
logical:
        ......;
otherrule:
        ......;
IF: 'if'; 
LPAREN : '(';
RPAREN : ')';
WS: (' ' | 't' | 'r' | 'n')->channel(HIDDEN);

当我使用此语法器解析时:

 if(a>b, 1, 2)

实例 MyExpressionContext 将有 8 个子项:

1 if
2 (
3 a>b
4 ,
5 1
6 ,
7 2
8 )

但我不需要((和,那种分隔符,我怎么能让孩子只有这些呢?

1 if
2 a>b
3 1
4 2

您可以通过将它们推送到->channel(HIDDEN)来忽略标记,就像处理空格一样。不过我理解你的问题:有时你不想隐藏它们,然后它们已经消失了。

就我个人而言,我认为将它们从您的上下文中删除的好处永远不会超过您必须为此进行的额外工作和维护的成本。我会说:只要接受这样一个事实,即有些令牌你永远不会在你的代码中使用。

最新更新