因此,在尝试为我的真实问题语言的以下简单子集创建语法时,我在使用antlr4中的模式时遇到问题:
a : abc
a : xyz
a : abc:d
a : someonthertext
语法是:
Simple.g4
grammar Simple;
import SimpleL;
prog : entry+;
entry : head semi tail tail_ws;
semi : SEMI;
tail : TAIL;
tail_ws : TAIL_WS;
head : HEAD;
SimpleL.g4
lexer grammar SimpleL;
WS : [ \t\r\n]+ -> skip;
SEMI : ':' -> pushMode(TMODE);
HEAD : 'a';
mode TMODE;
TAIL_WS: [ \t\r\n]+ -> popMode;
TAIL:[a-z:]+ ;
我使用antlr4 maven插件 - 4.2,构建的结果是:
[WARNING] warning(155): ... antlr4/Simple.g4:5:23: rule 'SEMI' contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output
这实际上打破了java构建。
[ERROR] ... antlr4/SimpleLexer.java:[63,19] error: cannot find symbol
Eclipse出现以下错误:
TMODE cannot be resolved to a variable
在这一行:
case 0: pushMode(TMODE); break;
问题与Why am I getting an error when assigning tokens to a channel?
类似答案 0 :(得分:2)
ANTLR 4中的组合语法不能使用多模词法分析器。导入SimpleL
词法分析器时,将忽略TMODE
模式。
您应该使用lexer grammar
和grammar
,而不是创建lexer grammar
和组合语法(仅parser grammar
)。
parser grammar Simple;
options {
tokenVocab = SimpleL;
}