ANTLR4中的令牌处理不一致

时间:2014-03-24 15:12:28

标签: antlr4

ANTLR4书引用了一个多模式的例子

https://github.com/stfairy/learn-antlr4/blob/master/tpantlr2-code/lexmagic/ModeTagsLexer.g4

lexer grammar ModeTagsLexer;

// Default mode rules (the SEA)
OPEN  : '<'     -> mode(ISLAND) ;       // switch to ISLAND mode
TEXT  : ~'<'+ ;                         // clump all text together

mode ISLAND;
CLOSE : '>'     -> mode(DEFAULT_MODE) ; // back to SEA mode 
SLASH : '/' ;
ID    : [a-zA-Z]+ ;                     // match/send ID in tag to parser

https://github.com/stfairy/learn-antlr4/blob/master/tpantlr2-code/lexmagic/ModeTagsParser.g4

parser grammar ModeTagsParser;

options { tokenVocab=ModeTagsLexer; } // use tokens from ModeTagsLexer.g4

file: (tag | TEXT)* ;

tag : '<' ID '>'
    | '<' '/' ID '>'
    ;

我尝试构建此示例,但使用«»字符作为分隔符。如果我只是替换我得到错误126

cannot create implicit token for string literal in non-combined grammar: '«'

事实上,只要我在解析器«规则中有tag字符,就会发生这种情况。

tag : '«' ID '>';

OPEN    : '«'   -> pushMode(ISLAND);
TEXT    : ~'«'+;

我是否有一些失踪的蚂蚁?这是使用antlr4-maven-plugin 4.2

维基在这些方面提到了一些东西,但我在阅读它的方式与github上的例子和使用<时的轶事经验相矛盾。请参阅&#34; Redundant String Literals&#34;在https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Lexer+Rules

2 个答案:

答案 0 :(得分:1)

以下情况之一正在发生:

  1. 您忘记更新 ModeTagsLexer.g4 中的OPEN规则,以使用以下表单:

    OPEN  : '«' -> mode(ISLAND) ;
    
  2. 您在ANTLR 4中发现了一个错误,应该向issue tracker报告。

答案 1 :(得分:0)

您是否指定了ANTLR在阅读语法时应使用的文件编码?对于小于255的欧洲字符应该没问题但是......