我是一位有用的助手,可以为您翻译文本。
我有一个ANTLR4监听器,处理标准且格式良好的语法,但是在处理非标准实现时遇到了困难。尽管所有变体都没有问题地通过了词法分析器,但解析阶段要棘手得多。
传统的做法可能是这样的:
但这很快就会变得难以维护。显而易见的解决方案是为标准实现创建一个
那么,我如何在解析过程中部分切换到另一个监听器,或者一旦知道我正在处理哪个变体,就使用新的监听器重新启动解析?
我有一个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
,然后为每个变体创建子类,但在开始解析之前我不知道它是哪个变体。那么,我如何在解析过程中部分切换到另一个监听器,或者一旦知道我正在处理哪个变体,就使用新的监听器重新启动解析?