我们知道语法树有抽象语法树. AST
和 具象语法树. CST
,
请问它们都是怎么生成的呢?
比如有一段代码:
var c = a + b; // a = 1, b = 2
我想要对它进行生成 AST 和 CST,请问是先生成哪个呢?具体的步骤大概是怎么生成的?
我们知道语法树有抽象语法树. AST
和 具象语法树. CST
,
请问它们都是怎么生成的呢?
比如有一段代码:
var c = a + b; // a = 1, b = 2
我想要对它进行生成 AST 和 CST,请问是先生成哪个呢?具体的步骤大概是怎么生成的?
在编译器设计和源代码解析过程中,通常首先生成的是具象语法树(Concrete Syntax Tree, CST),然后可能会进一步将其转换为抽象语法树(Abstract Syntax Tree, AST)。不过,值得注意的是,不是所有的编译器或解析器都会经历这两个步骤,有些可能直接生成AST。
var c = a + b;
,词法分析器会识别出var
、c
、=
、a
、+
、b
和;
等记号。var
声明、赋值操作和加法表达式等结构。AST是对CST的进一步抽象,它省略了源代码中的许多细节,只保留了必要的结构信息。AST的生成通常是在CST之后进行的,但并非必须。
在AST中,例如,一些括号和操作符可能被省略,因为它们的存在可以由树的结构隐式地表示。对于给定的代码,AST可能只会包含var
声明、赋值操作和加法表达式的主要节点,而不会包含像分号这样的标点符号。
注意:在实际的编译器设计中,是否生成CST以及是否将CST转换为AST取决于具体的需求和实现。有些编译器可能直接生成AST,以简化处理过程。
在你的例子中,首先会生成CST来表示整个赋值表达式var c = a + b;
,然后(如果编译器需要的话)会将其转换为AST。但是,由于AST的抽象性质,具体的表示方式可能因编译器而异。
10 回答11.1k 阅读
15 回答8.4k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
回答:编译原理还蛮有挑战性的,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