【发布时间】:2018-07-16 10:23:40
【问题描述】:
我有一个组合语法,我需要提供两个标识符词法分析器规则。 两个标识符可以同时使用。 Identifier1 在语法中位于 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
【问题讨论】:
标签: java grammar identifier antlr3 lexer