如何为专有语言构建 AST?

2024-03-17

我试图了解如何为专有语言构建 AST。我需要构建一个 AST,以便我可以输入我的规则和指南来检查源代码中可能存在的错误。

如何构建 AST?有没有任何书籍、文章可以帮助我入门。龙的编译器书有帮助吗?

请注意,我没有 CS 背景。

Thanks


这是一个相当大的问题。我确实感受到你的痛苦,因为我也是从非计算机背景背景解决这个问题的。这让我更加欣赏CS了。

您在研究中可能会经常看到的一件事是扩展巴科斯-诺尔范式 (EBNF)。它基本上是描述您的语言的一种方式。为您的语言创建 EBNF 将帮助您了解计算机解析它需要做什么,这会有所帮助。

回到手头的问题:您可能会使用词法分析器/解析器来构建树。

用于执行此操作的传统工具是 lex 和 yacc,或者它们更现代的近亲 flex 和 bison。

一种较新的方法是Antlr http://www.antlr.org/。强烈推荐它,但超出了我的理解范围。

我发现的第三种方法是 Python 的 pyparsing 库。由于我对 Python 的熟悉以及它描述你需要它解析的内容的可读方式,我最终选择了它。

有很多例子 http://pyparsing.wikispaces.com/Examples可用于 pyparsing,这很有帮助。我发现构建我的解析器最有帮助的是简单计算器 http://pyparsing.wikispaces.com/file/view/SimpleCalc.py。然而,它基于相当旧的 pyparsing 版本,并且比 pyparsing 后来实现的一些强大操作所需的更复杂。简单算术 http://pyparsing.wikispaces.com/file/view/simpleArith.py是一个类似但较新的版本。

我实际上尚未使用 pyparsing 处理的一件事是正确分析语法错误。然而,它似乎为您提供了这样做所需的工具。

无论如何,这并不是您问题的完整答案,但我希望它至少能为您指出一些起点。为复杂语言构建解析器并不容易!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为专有语言构建 AST? 的相关文章

  • 使用Fisher方法matlab组合P值?

    完成 CDF 后 我收到了以下值P 其中的样本 0 43 0 12 0 0021 0 05 0 017 0 001 0 025 0 038 0 35 0 29 我想结合我的P值的帮助下Fisher https en wikipedia or
  • 预处理器之后的 CDT IASTNode getRawSignature

    在CDT核心插件中 有一个方法getRawSignature接口的IASTNode被描述为 Returns the raw signature of the IASTNode before it is processed by the pr
  • 有没有JavaScript静态分析工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我做了一些愚蠢的事情 例如变量名拼写错误 时 我习惯于让编译器抱怨 但 JavaScript 习惯于让
  • 防止 this.state 与 setState 一起使用

    参考资料 https reactjs org docs react component html setstate states setState 并不总是立即更新组件 它可能会批量更新或推迟更新 这使得在调用 setState 后立即读取
  • Rascal:创建 AST 时 boolcollectBindings 的作用是什么?

    我有一个关于在 rascal 中创建 AST 的问题 我通常会执行以下操作 model createM3FromEclipseProject project testproject decls createAstsFromEclipsePr
  • 将 AST 节点转换为 python 代码

    假设我有以下字符串 code if 1 1 and 2 2 and 3 3 test 1 以下代码将该字符串转换为 AST ast parse code 然后我有一棵树 Module body lt ast If object at 0x1
  • 在打字稿 AST 中获取变量声明类型的正确方法?

    看了一眼declarationEmitter对于变量声明 它具有以下功能 emitVariableDeclaration最终调用 writeTypeOfDeclaration 这段代码的作用就是它所说的 它需要一个变量声明并打印变量及其类型
  • Java中如何查找未关闭的I/O资源?

    Java 中的许多 I O 资源 例如 InputStream 和 OutputStream 在使用完毕后需要关闭 如前所述here http www coderanch com t 202922 Performance java Uncl
  • 如何获取 Kotlin AST?

    我有一个包含 Kotlin 源代码的字符串 如何在运行时编译它并获取抽象语法树和类型信息进行分析 我对 Kotlin 编译器进行了一些调查 一些获得 AST 的概念证明可以在我的网站上看到GitHub 仓库 https github com
  • 用于代码分析的 Java 库

    有没有任何 Java 库可以帮助构建AST http en wikipedia org wiki Abstract syntax tree来自指定的 java 源文件 反之亦然 从 ASTree 对象生成代码 我需要类似的东西this ht
  • 为什么 linter 会选择无用的转义字符?

    转义字符串 模板文字和正则表达式中的非特殊字符没有任何效果 Source https eslint org docs rules no useless escape https eslint org docs rules no useles
  • 如何在 R 中获取 AST 作为列表

    我有字符串 它描述数学公式 我想将其转换为有意义部分的列表 功能ast 确实知道如何解析它 将其显示为抽象语法树 但不返回 AST 我正在寻找一个返回树的函数 bb lt media urin A media urin B 2 lazyev
  • 使用 Java 通过访问者模式从 AST 构建控制流图

    我试图弄清楚如何实现我的 LEParserCfgVisitor 类 以便从已使用 JavaCC 生成的抽象语法树构建控制流图 我知道已经存在一些工具 但我正在尝试这样做 为我的编译器期末考试做准备 我知道我需要一个将图形保存在内存中的数据结
  • 虚拟类作为 Spirit 的 AST 节点

    我当时正在和一个朋友一起开发一种语言的解释器 我们从一个我猜想不太明智的决定开始 我们首先制作所有用于执行的元素 实际上是由不同类组成的树 但现在看着 boost 的例子 我对如何合并两者感到很困惑 我知道从什么开始 语法 我知道要达到什么
  • 将ast节点转换为python对象

    给定一个ast可以自行计算的节点 但字面意义不够ast literal eval例如列表理解 src i 2 for i in range 10 a ast parse src Now a body 0 is an ast Expr and
  • 未初始化成员的警告在 C++11 上消失

    我编译这个简单的程序 include
  • 使用 neo4j 建模有序树

    我刚刚开始使用 neo4j 并且了解图形和关系的原理 但是我在想要建模的某些结构方面遇到了一些麻烦 我想在编程语言项目中使用它 并存储已解析源文件的 AST 从那里 我计划向节点添加大量额外的数据和关系 以帮助分析和工具 但基本的 AST
  • 从 C++ 文件中删除无用的行

    很多时候 当我调试或重用某些代码时 文件开始获取不执行任何操作的行 尽管它们可能在某一时刻执行了某些操作 像向量和填充然后不再使用之类的东西 定义但从未使用的类 结构 以及声明但从未使用的函数 我知道在很多情况下 其中一些东西并不是多余的
  • 生成 C / C++ 代码时表达式的结合性和优先级?

    我编写了一个生成 AST 的基本编译器 正确考虑了表达式中运算符的优先级 但是 在执行代码生成以生成 C 代码时 我不确定如何处理括号的使用 对于这个表达式 A B c AST如下 A B C 应该正确生成包含括号的前一个表达式 但是如果第
  • 如何在 PHP 中进行静态代码分析? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有PHP源文件的静态分析工具 二进制文件本身可以检查语法错误 但我正在寻找功能更多的东西 例如 未使用的变量赋值 未先初始化就分配到的

随机推荐