如何理解为ANTLR语法生成的ATN图?

5

我在我的ANTLR4语法中有两个简单的词法规则:

fragment Attrs : '.' ARCH; 
fragment ARCH : 'IA32' | 'X64' | 'IPF' | 'EBC' | 'common';

生成的ANTLR4.7 ATN如下(Visual Studio Code):

enter image description here

我搜索了一些关于“ATN”的参考资料,比如这个链接

它很漂亮,但我不理解它:

  • 节点中的数字和标签代表什么?
  • 箭头线上的epsilon符号代表什么?
  • 灰色和红色的节点代表什么?

为什么在不知道状态机是什么或有什么用处的情况下,你要生成一个状态机的图形呢? - IInspectable
我对正则表达式和确定有限状态自动机(DFA)有一些了解。但是我对语法设计还很陌生。我可以理解我提供的链接中的有限状态自动机,但对于所提出的图片并不十分确定。我希望了解ANTLR ATN的概念能够帮助我更好地设计ANTLR风格的语法。 - smwikipedia
1个回答

9
图中的ATN图表代表由解析器生成器产生的单个规则,由ATN状态组成。这些对于想要编写使用ATN的代码(例如用于代码完成)的开发人员非常有趣。通常情况下,您不需要在语法工作中使用此信息。当您更改语法时,查看ATN图表如何更改可能也会有所帮助(以微调语法)。图像中看到的是ATN状态的圆圈,带有其唯一ID(没有2个状态共享相同的状态编号),并附有标签,指示状态的类型(规则开始/结束状态,基本状态等)。将鼠标悬停在状态上,直到出现工具提示,可以获得更多信息。圆角矩形描述了由此规则调用的规则。大多数状态通过转换连接,这些转换描述了解析器执行此状态机时必须走的方向。转换可以在不消耗输入的情况下执行(称为epsilon转换,由小epsilon符号标记),或者需要某些输入匹配(在ATN中表示为label,并附加到图像中的转换箭头上)。

1
谢谢。能够得到 VS Code ANTLR 插件的作者回复是一种荣幸。这是一个很棒的工具,我真的很喜欢它。 - smwikipedia
很高兴听到它对你有用。 - Mike Lischke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接