我有一个组合的语法,我需要提供两个标识词法规则。 这两种标识可以同时使用。 标记位来自Identifer2之前语法。
第一标识符是静态的,而第二标识符规则一些标志的基础上变化。(使用谓词)。
我想第二标识符在语法规则相匹配。 但随着这两个标识符可以匹配一些常见的输入,它不会落在identifer2。
我创建了小的语法,使之可以理解的。 语法是:
@lexer::members
{
private boolean flag;
public void setFlag(boolean flag)
{
this.flag = flag;
}
}
identifier1 :
ID1
;
identifier2 :
ID2
;
ID1 : (CHARS) *;
ID2 : (CHARS | ({flag}? '_'))* ;
fragment CHARS
:
('a' .. 'z')
;
如果我尝试匹配identifer2规则为:
ANTLRStringStream in = new ANTLRStringStream("abcabde");
IdTestLexer lexer = new IdTestLexer(in);
lexer.setFlag(true);
CommonTokenStream tokens = new CommonTokenStream(lexer);
IdTestParser parser = new IdTestParser(tokens);
parser.identifier2();
它显示错误:线路1:0在“abcabde”失踪ID2