我知道可以在ANTLR语法中切换默认和隐藏令牌通道,但是我想要第三个通道。如何在gramar中定义新的令牌通道?例如,假设我想要一个名为ALTERNATIVE的频道。
答案 0 :(得分:2)
他们只是Token
class
中的final int
,所以你可以在你的词法分析中简单地引入一个额外的int
:
grammar T;
@lexer::members {
public static final int ALTERNATIVE = HIDDEN + 1;
}
// parser rules ...
FOO
: 'foo' {$type=ALTERNATIVE;}
;
// other lexer rules ...
相关的问与答:How do I get an Antlr Parser rule to read from both default AND hidden channel
答案 1 :(得分:1)
对于C目标,您可以使用
//This must be assigned somewhere
@lexer::context {
ANTLR3_UINT32 defaultChannel;
}
TOKEN : 'blah' {$channel=defaultChannel;};
这会在每个规则之后重置,因此如果您希望跨规则保留通道分配,则可能必须覆盖nextTokenStr()。