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

时间:2017-11-10 21:31:05

标签: c# antlr4

我有一个简单的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

1 个答案:

答案 0 :(得分:1)

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

我个人认为将它们从您的上下文中删除的好处永远不会超过为解决此问题而需要做的额外工作和维护的成本。我会说:只要接受这样一个事实,即你的代码中永远不会有令牌。