我有一个 ANTLR4 侦听器,它处理标准且格式正确的语法,但是我正在努力处理如何处理非标准实现。尽管所有变体都通过词法分析器没有问题,但解析阶段要复杂得多。
这样做的传统方式是
// Header of document
variant = STANDARD;
if (header.indexOf("microsoft") != -1) {
variant = MICROSOFT;
} else if (header.indexOf("google") != -1) {
variant = GOOGLE;
}
...
// Parsing a particular element
if (variant.equals(MICROSOFT)) {
// Microsoft-specific stuff
} else if (variant.equals(GOOGLE)) {
// Google-specific stuff
} else {
// Standard stuff
}
但这很快变得无法维护。显而易见的解决方案是ParseTreeListener
为标准实现提供一个,然后为每个变体对其进行子类化,但在开始解析之前我不知道它是哪个变体。
那么,如何在解析过程中从一个侦听器切换到另一个侦听器,或者一旦我知道我正在处理哪个变体,就使用新侦听器重新启动解析?