2017-11-10 106 views
1

我有一個簡單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

您可以將他們推向->channel(HIDDEN),就像你用空白做忽略令牌。但我理解你的問題:有時候你不想隱藏他們,然後他們已經離開了。

就我個人而言,我認爲將它們從您的上下文中移除的好處永遠不會超過您爲解決此問題而需要做的額外工作和維護的成本。我會說:只要接受這樣一個事實,即你永遠不會在代碼中使用令牌。

+0

好的解釋!謝謝你,帕特里克!似乎沒有辦法有選擇地刪除它們。我只是讓他們不被刪除,讓自己的邏輯來處理他們。 – Gisway