ANTLR:在语法中定义新频道

时间:2011-08-20 20:06:04

标签: antlr token grammar antlr3

我知道可以在ANTLR语法中切换默认和隐藏令牌通道,但是我想要第三个通道。如何在gramar中定义新的令牌通道?例如,假设我想要一个名为ALTERNATIVE的频道。

2 个答案:

答案 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()。