如何理解为 ANTLR 语法生成的 ATN 图?
How to understand ATN graph generated for ANTLR grammar?
我的 ANTLR4 语法中有 2 个简单的词法分析器规则:
fragment Attrs : '.' ARCH;
fragment ARCH : 'IA32' | 'X64' | 'IPF' | 'EBC' | 'common';
用ANTLR4.7生成的ATN是这样的(Visual Studio代码):
我搜索了一些关于“ATN”的参考文献,比如这个one。
很美,就是看不懂:
- 节点中的数字和标签是什么意思?
- 箭头线上的epsilon符号是什么意思?
- 灰色和红色节点是什么意思?
图中的 ATN 图表示单个规则,由解析器生成器生成的 ATN 状态组成。这些对于想要编写以某种方式使用 ATN 的代码(例如代码完成)的开发人员来说非常有趣。通常你的语法作业不需要这些信息。当您更改语法中的某些内容(用于微调语法)时,查看 ATN 图如何变化也可能派上用场。
您在图片中看到的是 ATN 州的圆圈,具有唯一 ID(没有 2 个州共享相同的州编号)以及指示州类型的标签(规则 start/end 州,基本州ETC。)。您可以通过将鼠标悬停在某个状态上直到获得工具提示来获取更多信息。圆角矩形描述了该规则调用的规则。
大多数状态通过转换连接,转换描述了解析器在执行此状态机时必须走的方向。可以在不消耗输入的情况下执行转换(然后称为 epsilon 转换,由那个小 epsilon 符号标记)或需要某些输入来匹配(在 ATN 中表示为 label
并且也附加到转换箭头在图形图像中)。
我的 ANTLR4 语法中有 2 个简单的词法分析器规则:
fragment Attrs : '.' ARCH;
fragment ARCH : 'IA32' | 'X64' | 'IPF' | 'EBC' | 'common';
用ANTLR4.7生成的ATN是这样的(Visual Studio代码):
我搜索了一些关于“ATN”的参考文献,比如这个one。
很美,就是看不懂:
- 节点中的数字和标签是什么意思?
- 箭头线上的epsilon符号是什么意思?
- 灰色和红色节点是什么意思?
图中的 ATN 图表示单个规则,由解析器生成器生成的 ATN 状态组成。这些对于想要编写以某种方式使用 ATN 的代码(例如代码完成)的开发人员来说非常有趣。通常你的语法作业不需要这些信息。当您更改语法中的某些内容(用于微调语法)时,查看 ATN 图如何变化也可能派上用场。
您在图片中看到的是 ATN 州的圆圈,具有唯一 ID(没有 2 个州共享相同的州编号)以及指示州类型的标签(规则 start/end 州,基本州ETC。)。您可以通过将鼠标悬停在某个状态上直到获得工具提示来获取更多信息。圆角矩形描述了该规则调用的规则。
大多数状态通过转换连接,转换描述了解析器在执行此状态机时必须走的方向。可以在不消耗输入的情况下执行转换(然后称为 epsilon 转换,由那个小 epsilon 符号标记)或需要某些输入来匹配(在 ATN 中表示为 label
并且也附加到转换箭头在图形图像中)。