java - 创建解析树以确定给定的 LL 语法的正确性

标签 java parsing compiler-construction context-free-grammar left-recursion

我有一个程序,当前将生成 token 输出,用于下一个程序的输入。它将检查代码语法的正确性。

我遇到了如何开始将此语法转换为可用程序的问题。

下面是语法使用,我将如何着手制作它。或者哪里有好的资源可以帮助我学习创建自己的解析器的基础知识。

这个实现将使用 Java,所以如果你能得到与 Java 实现相对应的答案,那就太棒了

program → stmt_list $$$

stmt_list → stmt stmt_list | ε

stmt → id = expr | input id | print expr

expr → term term_tail

term_tail → add op term term_tail | ε

term → factor fact_tail

fact_tail → mult_op fact fact_tail | ε

factor → ( expr ) | number | id

add_op → + | -

mult_op → * | / | // | %

最佳答案

您应该首先阅读编译器 - 原理、技术和工具(也称为龙书)的语法分析章节。
检查输出标记的步骤是:

  • 构建FirstFollow集合。
  • 构造预测解析表
  • 检查同一表格单元格中的多个产生式(冲突)

  • 所有这些步骤都可以在龙书上找到,并用各自的算法进行了完美的解释。
    我希望这有帮助。 这实际上只是解析之前的一个步骤,所以如果你到了能够检查语法是否为 LL(1) 的地步,我建议实现解析算法,它只是有一个将非终端压入的堆栈并引用该表以生成 AST

    关于java - 创建解析树以确定给定的 LL 语法的正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49959180/

    相关文章:

    java - android中的productFlavors和包

    c - 从文件中读取以 ';' 分隔的数据

    PHP 简单 HTML DOM 解析器死掉

    android - 解析异常,无法解析的日期

    compiler-construction - 用于编译器学习的简单、正式定义的语言

    C++ VS2010 编译器不使用 'push' 进行简单的函数调用

    java - 选择列表中的项目后在面板上设置标签

    java - Maven:包不存在。依赖关系似乎是正确的

    c# - 符号表存储 AST(声明)节点还是 "Symbols"不同的对象/类?

    java - 使用 diffie-hellman 共享 key 继续加密