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
答案 0 :(得分:1)
以下情况之一正在发生:
您忘记更新 ModeTagsLexer.g4 中的OPEN
规则,以使用以下表单:
OPEN : '«' -> mode(ISLAND) ;
您在ANTLR 4中发现了一个错误,应该向issue tracker报告。
答案 1 :(得分:0)
您是否指定了ANTLR在阅读语法时应使用的文件编码?对于小于255的欧洲字符应该没问题但是......