【问题标题】:How to get the abstact syntax tree using the language concrete syntax tree?如何使用语言具体语法树获得抽象语法树?
【发布时间】:2021-09-13 19:34:41
【问题描述】:

如何使用具体语法树解析文件并生成抽象语法树?

我在这篇关于 ungrammar 的博文中看到了具体的语法树。但是我不知道如何构建解析器。

【问题讨论】:

  • 您要解析什么语言?生锈本身?如果是这样,您是否有某些原因不想使用syn
  • 我正在从头开始构建自己的。 CST 似乎是一个不错的起点。
  • 你的问题没有多大意义。语法树(无论是具体的还是抽象的)是您的语言中某些文档的解析表示。如果您已经拥有文档的 CST,那么该文档必须已经被解析(并且获得 AST 只是在转换过程中“降低”CST 的情况)。所以“使用 CST 解析文件”只是一派胡言——不清楚您是在问如何构建解析器以生成 CST/AST,还是如何构建可以将 CST 降低为 AST 的工具?
  • 如果您正在为 Rust 编写解析器,我会首先查看 here 并尝试从中刮取标准的 EBNF 语法。解析器实现是here,您可以尝试抓取它,但会更困难——解析器包含语义谓词。 ungrammar 的文档说它是描述 CFG 类型的语法,但不编码对该类型系统的约束(例如,表达式中的优先级)。所以,我不会从那里开始。
  • 我忘了提...如果您正在寻找 Rust 的语法,并且不关心它是如何精确派生的,或者它是否是最新的,那么您可以使用this,采用 Antlr4 语法,并将其转换为适合其他解析器生成器、组合器或手动实现的形式。

标签: parsing rust abstract-syntax-tree concrete-syntax-tree


【解决方案1】:

具体的语法树只是树形式的源代码的无损表示。它基本上是抽象语法树的超集,因为它包含具有相对相同结构的相同信息,但包含抽象语法树会丢弃的额外“琐事”信息。

如果您熟悉更传统的形式解析技术,您可能还听说过它被称为“解析树”,它将由非基于动作的解析器生成器输出,然后您通常会发布处理到更适合以后编译器传递的 AST。

CST 更接近于 AST,因为它通常比词法结构更匹配语言的语义结构,但最终它们都是相同的结构基本概念,只是表示解析语言的稍微不同的视图.

因此,无论您是解析为正式的解析树、CST,还是直接解析为 AST(甚至是 IR 字节码),这些都不会直接影响您使用的解析技术,只会影响您使用的结构在解析时构建。

所以你的问题归结为“我应该如何解析源代码”的意见问题,这是一个相当开放的问题。解析器组合器在 Rust 中往往很流行,但即使只是固定前瞻递归下降也非常强大且易于操作。

【讨论】:

  • 您需要小心“无损”这个短语。大多数 CST/AST 不捕获空白内容或标记格式信息,甚至不捕获文字的基数。如果不捕获 每个 源字符,就不能做到“无损”(例如,准确地重新生成原始源)。 AST/CST 可以是同构的,如果没有人会查看从树中重新生成的代码,这将非常有用。如果人们确实查看了重新生成的代码,则很难捕获足以满足他们的需求。请参阅我关于“将 AST 编译回源代码”的 SO 答案:stackoverflow.com/a/5834775/120163
  • @IraBaxter:对 AST 来说是的。 AST 的部分意义在于它们丢弃了无用的信息。但是CSTs/LSTs 和rowan(ungrammar 用于的CST)的重点是它们完全无损的,并且准确地代表了输入文件。我知道有些人使用 CST 来指代代表“纯糖”差异的 AST,或者是解析树而不是 AST,但是我学会使用 CST 的方式是参考确切源代码的无损语法树表示.
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多