鉴于以下ANTLR 3语法:
statement1 : CHAR_KEYWORD;
statement2 : DIGIT_KEYWORD (COLON_KEYWORD DIGIT_KEYWORD)?;
COLON_KEYWORD : ':';
DIGIT_KEYWORD : '0'..'9';
CHAR_KEYWORD : 'a'..'z' | COLON_KEYWORD;
解析以下文字时:
1
规则 statement2 选择此文本。这很好。但是,如果现在有一个文本:
1:2
规则 statement2 不会选择此文本并出错。这是因为":"由CHAR_KEYWORD匹配,这不是规则的一部分。如果从CHAR_KEYWORD中删除COLON_KEYWORD,则规则 statement2 正常工作,但规则 statement1 现在不能按要求工作。如何重构这个语法,以便规则 statement1 和 statement2 按预期工作?谢谢!
答案 0 :(得分:0)
从CHAR_KEYWORD中删除COLON_KEYWORD alt,而是将其作为alt添加到statement1。
statement1 : CHAR_KEYWORD | COLON_KEYWORD;
statement2 : DIGIT_KEYWORD (COLON_KEYWORD DIGIT_KEYWORD)?;
COLON_KEYWORD : ':';
DIGIT_KEYWORD : '0'..'9';
CHAR_KEYWORD : 'a'..'z';