【发布时间】:2012-02-26 19:35:57
【问题描述】:
我一直在研究编译器。词法分析器似乎非常直截了当:取一个“句子”并将其分解为单词(或标记)。为了确保语法正确,需要一个解析器。解析器通常会获取标记并构建一棵树,该树会产生一个根节点(单词到句子、段落、页面等......)。
从this question 看来,解析器会构建一个 AST。 AST 仅包含执行代码所必需的内容,因此不需要括号之类的内容,因为运算符优先级内置于 AST 中。 AST 可能是编译器所需要的全部内容。
但是如何将代码从一种语言转换为另一种语言呢?采用一种组合语言(语法)或现有语法并将其转换为另一种运算符优先级规则可能不同也可能不同的地方?运算符优先级是否也“内置”到 CST 中?
例如,假设我创建了一种语言并想将其翻译成 PHP 代码。大多数语言的三元运算符具有从右到左的结合性。 PHP 错误地使用了从左到右的关联性 (see more about this here)。我希望“我的语言”从右到左使用,但生成的 PHP 代码必须应用括号才能在 PHP 中获得正确的结果(使用link to Wikipedia,结果需要是“train”而不是“horse”)。
那么对于语言翻译,CST 会更好吗?运算符优先级通常内置在 CST 中吗?中间有什么吗?有没有用简单的代数方程比较两棵树的例子?有没有说明三元运算符的例子?
(“转码”是“编程语言翻译”的正确术语吗?谷歌搜索会显示转换媒体。)
我想弄清楚的是:什么时候使用一个比另一个更合适?
【问题讨论】:
-
我不明白为什么您需要具体的语法树来进行语言到语言的翻译。具体语法正是最有可能不同的地方。您想用另一种语言创建一个具有类似 语义 的程序,因为您只需要原始程序的 语义,而 AST 就可以为您提供更少的混乱。
-
啊,我明白你的意思了。那么具体树什么时候会被使用并被认为比抽象树更合适,具体树是否关心优先级?
标签: compiler-construction abstract-syntax-tree concrete-syntax-tree