我一直在阅读有关解释器/编译器如何工作的一些内容,而我感到困惑的一个领域是AST和CST之间的区别.我的理解是解析器生成一个CST,将它交给语义分析器,将其转换为AST.但是,我的理解是语义分析器只是确保遵循规则.我真的不明白为什么它会实际做出任何改变,使其变得抽象而不是具体.
有没有关于语义分析器的东西,或者AST和CST之间的差异有点人为?
parsing terminology abstract-syntax-tree semantic-analysis concrete-syntax-tree
有没有人知道在哪里可以找到好的在线资源以及如何制作语法和解析树的例子?优选的是介绍材料.n00b友好的信息,我自己没有发现任何与谷歌有关的信息.
编辑:我在考虑理论,而不是特定的解析器软件.
我一直在研究编译器.词法分析器似乎非常直接:取一个"句子"并将其分解为单词(或标记).为了确保正确的语法,需要一个解析器.解析器通常采用令牌并构建一个树,从而产生根节点(将单词分为句子,段落,页面等等).
从这个问题来看,似乎解析器会构建一个AST.AST只包含执行代码所需的内容,所以括号之类的内容是不必要的,因为运算符优先级内置在AST中.AST可能都是编译器需要的.
但是如何将代码从一种语言转换为另一种语言?采用一种伪造的语言(语法)或现有的语法并将其转换为另一种语言,其中运算符优先级规则可能会有所不同?运营商优先还是"内置"到CST吗?
举个例子,假设我编写了一种语言,并希望将其翻译成PHP代码.大多数语言的三元运算符具有从右到左的关联性.PHP错误地使用从左到右的关联性(请在此处查看更多相关信息).我希望"我的语言"从右到左使用,但生成的PHP代码必须应用括号才能在PHP中获得正确的结果(通过指向Wikipedia的链接,结果需要是"train"而不是"horse").
因此,对于语言翻译,CST会更好吗?运营商优先级通常是否构建在CST中?介于两者之间吗?有没有例子比较两个树和一个简单的代数方程?任何说明三元运算符的例子?
("转码"是"编程语言翻译"的正确术语吗?谷歌搜索会带来转换媒体.)
我想弄清楚的是:什么时候使用一个比另一个更合适?
compiler-construction abstract-syntax-tree concrete-syntax-tree
将解析树(即具体语法树)简化为抽象语法树的一般策略是什么?
例如,我有以下语法规则:
statement_list : statement
| statement_list statement
Run Code Online (Sandbox Code Playgroud)
如果保留为解析树,它将生成看起来像扇形输出
program
statement_list
statement_list
statement
definition
p_type
assignment
statement
definition
statement
assign
assignment
Run Code Online (Sandbox Code Playgroud)
如果我连接每个节点的子节点(因为语句列表在解析后没有固有含义),我可以实现以下内容
program
definition
p_type
assignment
definition
assign
assignment
Run Code Online (Sandbox Code Playgroud)
这很好用 - 但是,我没有意识到这样做的任何"规则".是否有特定的语法规则我应该简化?这是一种感觉问题,还是一个更机械化的过程?
compiler-construction grammar parsing abstract-syntax-tree concrete-syntax-tree
解析HTML或XML文件后,我们可以得到DOM树。
解析 C、C++ 或 JavaScript 后,我们可以获得语法树。
请注意,语法树是基于上下文无关语法构建的,该语法指定有效的 C/C++/JS 程序。
但看起来 DOM 树只是一个仅由 HTML/XML 文件指定的纯粹的层次结构。真的吗?这就是解析后进行架构验证的原因吗?这两种解析树的根本区别是什么?
schema parsing dom context-free-grammar concrete-syntax-tree
我正在使用pyPEG为简单语法创建解析树。该树使用列表和元组来表示。这是一个例子:
[('command',
[('directives',
[('directive',
[('name', 'retrieve')]),
('directive',
[('name', 'commit')])]),
('filename',
[('name', 'f30502')])])]
Run Code Online (Sandbox Code Playgroud)
我的问题是此时我该怎么办?我知道很大程度上取决于我想要做什么,但我无法找到太多有关使用/使用解析树的信息,只能创建它们。有人有我可能使用的参考资料吗?
感谢您的帮助。