我遇到了非常有趣的问题。我们来看它作为一个例子。
grammar1 :
TAG_SYMBOL: '@';
tagSymbol: TAG_SYMBOL;
grammar2 :
TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
tagSymbol: TAG;
让我们用 tagSymbol 规则解析“@”文本。
语法1:
line 1:0 mismatched input '@' expecting '@'.
语法2:
OK.
为什么呢? :)
答案 0 :(得分:0)
写作时:
TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
即使解析器可能需要@
,输入TAG_SYMBOL
仍将被标记为TAG
,而不是TAG
。这就是ANTLR的工作原理。匹配最多的词法分析器规则将获胜,当2个或更多词法分析器规则匹配相同数量的字符时,首先定义的那个将获胜。
您遇到的错误:
第1行:0输入不匹配' @'期待' @'。
应如下所示:
第1行:0输入文字不匹配' @'类型
TAG_SYMBOL
,期待' @'类型TAG
。
如果您想同时拥有标记和标记符号,则应使用解析器规则:
parse : tag | tagSymbol;
tag : AT;
tagSymbol : AT;
AT : '@';
错误消息不对。我认为你没有(重新)生成一个新的解析器而感到困惑。
以下是我的测试结果:
grammar T;
TAG_SYMBOL: '@';
tagSymbol: TAG_SYMBOL;
grammar T;
TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
tagSymbol: TAG;
测试类:
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRInputStream("@"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.tagSymbol();
}
}
从语法1生成解析器后运行主类不会产生错误/警告,并且从语法2生成的解析器会生成以下内容:
第1行:0输入不匹配' @'期待TAG
使用ANTLR 4.5进行测试。