我正在尝试理解 antlr 生成的文件。我有两个输入 .g4 ( TSqlParser.g4 和 TSqlLexer.g4 )文件。
运行 antlr
(4.7.2) 时使用:
java -cp .;antlr.jar org.antlr.v4.Tool -Dlanguage=CSharp *.g4
它生成以下文件:
/
│ TSqlLexer.cs
│ TSqlLexer.interp
│ TSqlLexer.tokens
│ TSqlParser.cs
│ TSqlParser.interp
│ TSqlParser.tokens
│ TSqlParserBaseListener.cs
│ TSqlParserListener.cs
什么是 *.interp
和 *.tokens
文件?这些是帮助文件吗?我找不到任何有关它们的文档。如果它们是帮助文件,为什么它们不被自动清理?
最佳答案
.interp
和 .tokens
文件用于特定目的,语法作者通常不感兴趣。
.tokens
文件:包含由 ANTLR4 生成的标记名称及其数字分配的列表。这些仅为词法分析器创建。当您向解析器语法添加 tokenVocab 选项时(仅适用于拆分语法),ANTLR4 将实际使用此标记文件,而不是词法分析器语法。这意味着必须首先生成词法分析器,以便为解析器生成准备好标记文件。顺便提一句。您还可以在词法分析器中设置 tokenVocab,以从其他来源导入标记分配。例如,这可以用于指定显式标记值,而与词法分析器规则在语法中的显示方式无关。如果您想确保某些标记具有非常特定的标记类型(即,将所有关键字放在连续范围内以允许快速检查它们),这将非常有帮助。我在 MySQL Workbench 的解析器中使用这种方法..interp
:这是 ANTLR4 的一个相对较新的补充,包含允许运行内置解释器而不是生成的解析器的数据。这主要用于允许调试语法的 IDE,例如我的 ANTLR4 extension for vscode 。该文件包含与生成的解析器/词法分析器文件完全相同的信息( token /规则名称、它们的显示名称、序列化的 ATN、模式 + 词法分析器的 channel 名称)。
关于Antlr 生成的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59734259/