首页 > 解决方案 > 这个奇怪的 StringBuilder 在 ANTLR 生成的代码中做了什么?

问题描述

我正在尝试学习如何在 Unity 中使用 Antlr4。我从其他程序中看到了 ActionLexer 类中的代码

private static string _serializeATN()
{
StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.Append("\u0003а훑舆괭䐗껱趀ꫝ\u0002\u000e");
        stringBuilder.Append("\u00a0\b\u0001\u0004\u0002\t\u0002\u0004\u0003\t\u0003\u0004\u0004\t\u0004\u0004\u0005\t\u0005\u0004\u0006");
        stringBuilder.Append("\t\u0006\u0004\a\t\a\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\v\t\v\u0004\f\t\f");
        stringBuilder.Append("\u0004\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010\t\u0010\u0004\u0011\t\u0011\u0004");
        stringBuilder.Append("\u0012\t\u0012\u0003\u0002\u0003\u0002\u0003\u0003\u0003\u0003\u0003\u0004\u0003\u0004\u0003\u0005\u0003\u0005\u0003");
        stringBuilder.Append("\u0006\u0003\u0006\u0003\a\u0003\a\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b");   
             ...
return stringBuilder.ToString();

}

然后我在统一中复制了该代码并对其进行了调试。结果是奇怪的字符串。

+       stringBuilder   "а훑舆괭䐗껱趀ꫝ \b\t\t\t\t\t\a\t\a\b\t\b\t\t\t\n\t\n\v\t\v\f\t\f" System.Text.StringBuilder

我想知道为什么会这样。这个功能的作用是什么?

标签: c#unity3dantlr4

解决方案


ATN 是 ATN 解释器用来执行 parser + lexer 状态机的内部网络(Augmented Transition Network)。这个结构是由 ANTLR 根据给定的语法生成的,并且是 ANTLR 实现的整个机制的核心。

生成的解析器和词法分析器需要它们的 ATN 才能正常工作。但是由于生成的文件是文本,因此有必要将生成的网络序列化为文本字符串,以便能够将其写入生成的文件。然后在解析应用程序启动时对该字符串进行反序列化,以在内存中重新生成原始 ATN。简而言之:它本身不是文本,而是以文本形式存储的二进制数据。

ATN 属于解析器/词法分析器实现的内部,在大多数情况下您可以放心地忽略它。


推荐阅读