问题标签 [concrete-syntax-tree]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1160 浏览

grammar - 解析树和语法信息

有谁知道在哪里可以找到好的在线资源以及如何制作语法和解析树的示例?最好是介绍材料。对 n00b 友好的信息,我自己在 Google 上没有发现任何好处。

编辑:我在考虑理论,而不是特定的解析器软件。

0 投票
9 回答
36626 浏览

parsing - 抽象语法树和具体语法树有什么区别?

我一直在阅读一些关于解释器/编译器如何工作的内容,而我感到困惑的一个领域是 AST 和 CST 之间的区别。我的理解是解析器生成一个 CST,将其交给语义分析器,语义分析器将其转换为 AST。但是,我的理解是语义分析器只是确保遵循规则。我真的不明白为什么它实际上会进行任何更改以使其抽象而不是具体。

关于语义分析器,我是否缺少某些东西,或者 AST 和 CST 之间的区别是否有些人为?

0 投票
1 回答
908 浏览

python - 我如何处理具体语法树?

我正在使用pyPEG为简单的语法创建解析树。树使用列表和元组表示。这是一个例子:

我的问题是此时我该怎么办?我知道很多取决于我想要做什么,但我无法找到很多关于消费/使用解析树的信息,只能创建它们。有没有人有任何指向我可能使用的引用的指针?

谢谢你的帮助。

0 投票
1 回答
257 浏览

javascript - NullLiteral 如何以树的形式表示?

根据第7.8.1节中的ECMAScript 规范, a定义如下:NullLiteral

我想了解的是,当 aNullLiteral包含在第7.6.17.8节中的以下产品中时,它是如何以树形表示的。

我对它的外观的最佳猜测是:

不过,这对我来说似乎不正确。

笔记

根据我的研究,似乎很少有编译器真正从语言语法生成 CST。我当然可以理解为什么,但这对我来说是一个学习练习,所以我想在我转向更专业的解析方法(例如使用解析器生成器)之前解决这个问题。

0 投票
1 回答
1657 浏览

compiler-construction - 何时使用抽象或具体的语法树?

我一直在研究编译器。词法分析器似乎非常直截了当:取一个“句子”并将其分解为单词(或标记)。为了确保语法正确,需要一个解析器。解析器通常获取标记并构建一个树,该树会产生一个根节点(单词到句子、段落、页面等......)。

这个问题来看,解析器似乎会构建一个 AST。AST 仅包含执行代码所必需的内容,因此不需要括号之类的内容,因为运算符优先级内置于 AST 中。AST 可能是编译器所需要的。

但是如何将代码从一种语言转换为另一种语言呢?将一种组合语言(语法)或现有语法转换为另一种运算符优先级规则可能不同也可能不同的语法?运算符优先级是否也“内置”到 CST 中?

例如,假设我创建了一种语言并想将其翻译成 PHP 代码。大多数语言的三元运算符具有从右到左的结合性。PHP 错误地使用了从左到右的关联性(在此处查看更多信息)。我希望“我的语言”从右到左使用,但生成的 PHP 代码必须应用括号才能在 PHP 中获得正确的结果(通过Wikipedia 的链接,结果需要是“train”而不是“horse”)。

那么对于语言翻译,CST 会更好吗?运算符优先级通常内置在 CST 中吗?中间有什么吗?有没有将两棵树与一个简单的代数方程进行比较的例子?任何说明三元运算符的示例?

(“转码”是“编程语言翻译”的正确术语吗?谷歌搜索会显示转换媒体。)

我想弄清楚的是:什么时候使用一个比另一个更合适?

0 投票
2 回答
1695 浏览

parsing - DOM 树解析和语法树解析的区别?

解析 HTML 或 XML 文件后,我们可以得到 DOM 树。

在解析 C、C++ 或 JavaScript 之后,我们可以得到语法树。

请注意,语法树是基于指定有效 C/C++/JS 程序的上下文无关语法构建的。

但似乎 DOM 树只是由 HTML/XML 文件指定的纯层次结构。真的吗?这就是解析后进行Schema Validation的原因吗?这两种解析树的根本区别是什么?

0 投票
1 回答
2210 浏览

parsing - 如何将我的解析树简化为抽象语法树?

将解析树(即具体语法树)简化为抽象语法树的一般策略是什么?

例如,我有以下语法规则:

如果将其保留为解析树,则会生成看起来像这样的扇形输出

如果我将每个节点的子节点连接起来(因为语句列表在解析后没有内在含义),我可以实现以下

这运作良好 - 但是,我不知道这样做的任何“规则”。是否有我应该简化的特定语法规则?是感觉的问题,还是有更机械的过程?

0 投票
2 回答
315 浏览

python - 如何阻止“ast.parse”将数值转换为整数/浮点数?

例如::

如何让解析器将 python 源文件转换为语法树,同时保留str类型中节点的原始值?因为我需要使用尽可能精确的分数将例如 '1.2' 转换为精确值,而不会丢失任何精度(值 1.2 不能以浮点格式精确表示)。

最好我希望在不重新实现解析器的情况下这样做。ast也许有其他解析器比模块更适合这个。

顺便说一句,我不仅需要解析表达式,还需要解析程序。

0 投票
1 回答
64 浏览

whitespace - 是否可以在不访问语法树的情况下修复缩进大小问题?

换一种方式问,如果我向您展示这个仅使用您的人脑的屏蔽代码文件,是否有可能解决缩进问题,即使您知道它应该是 2 空格缩进?

我有自己的想法,但我不想对答案有偏见。实际的源代码和语言将在我得到一批好的答案后揭晓。随时将您的修复作为代码块发布在下面。

此测试假定以下内容:

  1. 您不知道编写此代码的语言。
  2. 您所知道的就是每行的第一个字符前有多少个空格或制表符。在这种情况下,没有制表符(只有空格)。
  3. 你知道缩进大小应该是多少。在这种情况下,2 个空格。

注意:如果你的人脑可以做到,那么代码也应该可以,对吧?

奖励积分(可选):你会如何分解逻辑来解决这个问题?

编辑:这是创建这些 exe 的源代码:

0 投票
1 回答
339 浏览

abstract-syntax-tree - 如何将 LR(1) Parse 翻译成抽象语法树?

我编写了一个表驱动的 LR(1) 解析器,它工作得很好,但是在将解析转换为语法树/抽象语法树的阶段我有点脱节。这是一个我非常热衷的项目,但我真的只是在这里遇到了死胡同。提前谢谢你的帮助。

编辑:我的解析器也只使用一个二维数组和一个动作对象,告诉它下一步去哪里,或者它是否减少去哪里以及要弹出多少项目。我注意到很多人使用访问者模式。我不确定他们如何知道要制作哪种类型的节点。

这是上下文的下推自动机