因此,在尝试为以下简单的问题语言子集创建语法时,我在antlr4中使用模式时遇到了问题:
a : abc
a : xyz
a : abc:d
a : someonthertext
语法是:
简单.g4
grammar Simple;
import SimpleL;
prog : entry+;
entry : head semi tail tail_ws;
semi : SEMI;
tail : TAIL;
tail_ws : TAIL_WS;
head : HEAD;
简单L.g4
lexer grammar SimpleL;
WS : [ trn]+ -> skip;
SEMI : ':' -> pushMode(TMODE);
HEAD : 'a';
mode TMODE;
TAIL_WS: [ trn]+ -> 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;
问题似乎类似于为什么在将令牌分配给通道时出现错误?
ANTLR 4 中的组合语法不能使用多模式词法分析器。导入SimpleL
词法分析器时,将忽略TMODE
模式。
与其创建lexer grammar
和组合语法(仅grammar
),不如使用lexer grammar
和parser grammar
。
parser grammar Simple;
options {
tokenVocab = SimpleL;
}