我正在使用 antlr 3 和 Antlrworks。这是我的设置:
lexer Base //包含基本标记 - 如 WS、数字等。
lexer Specific //包含我的语言特定标记 - 并且派生自 Base lexer
特定于解析器的//我的语言的解析器
组合语法 -> 导入特定的词法分析器和特定的解析器
当我生成时,我总是得到一个 NPE(在 Java 中)。原因是生成的特定词法分析器中对 Base 词法分析器的引用没有初始化。
我错过了什么吗?
我正在使用 antlr 3 和 Antlrworks。这是我的设置:
lexer Base //包含基本标记 - 如 WS、数字等。
lexer Specific //包含我的语言特定标记 - 并且派生自 Base lexer
特定于解析器的//我的语言的解析器
组合语法 -> 导入特定的词法分析器和特定的解析器
当我生成时,我总是得到一个 NPE(在 Java 中)。原因是生成的特定词法分析器中对 Base 词法分析器的引用没有初始化。
我错过了什么吗?
没有看到你是如何导入语法的,就不可能说出来。
请记住:
在你的情况下,这看起来像:
lexer grammar BaseLexer;
Num : '0'..'9'+;
Space : ' ' | '\t';
lexer grammar SpecificLexer;
import BaseLexer;
SpecificTokenA : 'specificA';
SpecificTokenB : 'specificB';
parser grammar SpecificParser;
specific : SpecificTokenA | SpecificTokenB;
grammar Combined;
import SpecificLexer, SpecificParser;
parse
: Num Space specific EOF
{
System.out.println("Parsed:\n Num = " +
$Num.text + "\n specific = " + $specific.text);
}
;
并测试这一切,使用类:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
SpecificLexer lexer = new SpecificLexer(new ANTLRStringStream("42 specificB"));
CombinedParser parser = new CombinedParser(new CommonTokenStream(lexer));
parser.parse();
}
}
现在生成词法分析器和解析器并运行Main
该类:
java -cp antlr-3.3.jar org.antlr.Tool BaseLexer.g
java -cp antlr-3.3.jar org.antlr.Tool SpecificLexer.g
java -cp antlr-3.3.jar org.antlr.Tool SpecificParser.g
java -cp antlr-3.3.jar org.antlr.Tool Combined.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main
这会将以下内容打印到您的控制台:
Parsed:
Num = 42
specific = specificB
还使用 ANTLRWorks 1.4.3 进行了测试。
我在使用 antlr 3.2 时遇到了同样的问题。升级并不简单,因为我面临 OutOfMemory 问题。
我尝试了不同的解决方案,例如在解析器语法中直接导入两个词法分析器语法,但没有成功。最后,我不得不在每个特定词法分析器语法中复制基本词法分析器语法。