我一直在研究编译器。词法分析器似乎非常直接:将一个“句子”分解成单词(或令牌)。为确保正确的语法,需要使用解析器。解析器通常会取出令牌并构建一棵树,结果是一个根节点(将单词组成句子、段落、页面等)。
从这个问题来看,解析器会构建抽象语法树(AST)。AST仅包含执行代码所需的内容,因此括号之类的东西是不必要的,因为运算符优先级已经内置到AST中。AST可能是编译器所需的全部内容。
但是,如何将代码从一种语言转换为另一种语言呢?以一个虚构的语言(语法)或现有的语法为例,并将其转换为另一种语言,在该语言中,运算符优先规则可能与原语言不同。CST中也内置了运算符优先级吗?
例如,假设我编写了一种语言,并希望将其翻译成PHP代码。大多数语言中的三元运算符具有从右到左的结合性。PHP错误地使用了从左到右的结合性(在此处了解更多)。我希望“我的语言”使用从右到左,但是生成的PHP代码必须应用括号才能在PHP中得到正确的结果(在维基百科上,结果应为“train”,而不是“horse”)。
因此,对于语言翻译,CST是否更好?运算符优先级通常内置于CST中吗?是否有介于两者之间的东西?是否有任何比较简单代数方程的示例来比较两种树?是否有说明三元运算符的示例?
(“转码”是“编程语言翻译”的正确术语吗?谷歌搜索会出现转换媒体的结果。)
我的问题是:什么时候使用一种方法比另一种方法更合适?
从这个问题来看,解析器会构建抽象语法树(AST)。AST仅包含执行代码所需的内容,因此括号之类的东西是不必要的,因为运算符优先级已经内置到AST中。AST可能是编译器所需的全部内容。
但是,如何将代码从一种语言转换为另一种语言呢?以一个虚构的语言(语法)或现有的语法为例,并将其转换为另一种语言,在该语言中,运算符优先规则可能与原语言不同。CST中也内置了运算符优先级吗?
例如,假设我编写了一种语言,并希望将其翻译成PHP代码。大多数语言中的三元运算符具有从右到左的结合性。PHP错误地使用了从左到右的结合性(在此处了解更多)。我希望“我的语言”使用从右到左,但是生成的PHP代码必须应用括号才能在PHP中得到正确的结果(在维基百科上,结果应为“train”,而不是“horse”)。
因此,对于语言翻译,CST是否更好?运算符优先级通常内置于CST中吗?是否有介于两者之间的东西?是否有任何比较简单代数方程的示例来比较两种树?是否有说明三元运算符的示例?
(“转码”是“编程语言翻译”的正确术语吗?谷歌搜索会出现转换媒体的结果。)
我的问题是:什么时候使用一种方法比另一种方法更合适?