语法树进行生成 AST 和 CST,请问是先生成哪个呢?具体的步骤大概是怎么生成的?

我们知道语法树有抽象语法树. AST具象语法树. CST
请问它们都是怎么生成的呢?
比如有一段代码:

var c = a + b; // a = 1, b = 2

我想要对它进行生成 AST 和 CST,请问是先生成哪个呢?具体的步骤大概是怎么生成的?

阅读 1.3k
avatarAI BotBETA

在编译器设计和源代码解析过程中,通常首先生成的是具象语法树(Concrete Syntax Tree, CST),然后可能会进一步将其转换为抽象语法树(Abstract Syntax Tree, AST)。不过,值得注意的是,不是所有的编译器或解析器都会经历这两个步骤,有些可能直接生成AST。

CST(具象语法树)的生成

  1. 词法分析(Lexical Analysis)
    将源代码分解为一系列的记号(tokens)。对于给定的代码 var c = a + b;,词法分析器会识别出varc=a+b;等记号。
  2. 语法分析(Syntax Analysis)
    根据语言的语法规则,将记号组合成语法结构(如表达式、语句、函数定义等)。这个过程会生成CST,CST包含了源代码中的所有细节和结构。对于给定的代码,CST会明确地表示出var声明、赋值操作和加法表达式等结构。

AST(抽象语法树)的生成

AST是对CST的进一步抽象,它省略了源代码中的许多细节,只保留了必要的结构信息。AST的生成通常是在CST之后进行的,但并非必须。

在AST中,例如,一些括号和操作符可能被省略,因为它们的存在可以由树的结构隐式地表示。对于给定的代码,AST可能只会包含var声明、赋值操作和加法表达式的主要节点,而不会包含像分号这样的标点符号。

注意:在实际的编译器设计中,是否生成CST以及是否将CST转换为AST取决于具体的需求和实现。有些编译器可能直接生成AST,以简化处理过程。

步骤总结

  1. 词法分析:将源代码分解为记号。
  2. 语法分析:根据语法规则将记号组合成CST。
  3. (可选)抽象化:将CST转换为AST,省略不必要的细节。

在你的例子中,首先会生成CST来表示整个赋值表达式var c = a + b;,然后(如果编译器需要的话)会将其转换为AST。但是,由于AST的抽象性质,具体的表示方式可能因编译器而异。

1 个回答

回答:编译原理还蛮有挑战性的,CST是先生成的,会根据文法进行解析,得到一些结构,其中会进行语法分析,判断是否有一些基本的语法错误等操作;可以参考这个教程:https://buaa-se-compiling.github.io/miniSysY-tutorial/进行学习,它介绍了类C语言的一个小型编译器的实现思路;主要还是聚焦于程序结构的变量、语句、运算符等;也可以参考这个教程,这个教程对原理的解释还蛮清晰的:https://decaf-lang.github.io/minidecaf-tutorial/docs/step1/ar...;关于本问题的解答,可以参考这个回答:https://yiyan.baidu.com/share/iBRktzR5jq,还有这篇文章,感觉会有不少收获:https://www.codenong.com/1888854/#google_vignette

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题