简体   繁体   English

ANTLR:在语法中定义新通道

[英]ANTLR: Define new channel in grammar

I know it is possible to switch between the default and hidden token channels in an ANTLR grammar, but lets say I want a third channel. 我知道可以在ANTLR语法的默认令牌通道和隐藏令牌通道之间进行切换,但是可以说我想要第三个通道。 How can I define a new token channel in the gramar? 如何在gramar中定义新的令牌通道? For instance, lets say I want a channel named ALTERNATIVE. 例如,假设我想要一个名为ALTERNATIVE的频道。

They're just final int 's in the Token class , so you could simply introduce an extra int in your lexer like this: 它们只是Token中的final int ,因此您可以像这样在词法分析器中简单地引入一个额外的int

grammar T;

@lexer::members {
  public static final int ALTERNATIVE = HIDDEN + 1;
}

// parser rules ...

FOO
  :  'foo' {$type=ALTERNATIVE;}
  ;

// other lexer rules ...

A related Q&A: How do I get an Antlr Parser rule to read from both default AND hidden channel 一个相关的问答: 我如何获得一个Antlr Parser规则以从默认通道和隐藏通道中读取

For the C target you can use 对于C目标,您可以使用

//This must be assigned somewhere
@lexer::context {
  ANTLR3_UINT32 defaultChannel;
}

TOKEN : 'blah' {$channel=defaultChannel;};

This gets reset after every rule so if you want a channel assignment to persist across rules you may have to override nextTokenStr(). 每条规则后都会重置此设置,因此,如果您希望通道分配在所有规则中都保持不变,则可能必须覆盖nextTokenStr()。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM