【问题标题】:Java - Abstract Syntax Tree with grammarJava - 带有语法的抽象语法树
【发布时间】:2020-05-22 20:31:48
【问题描述】:

我正在使用正则表达式构建一个简单的语法分析器。它有效,但现在我想添加抽象语法树。但我仍然不明白如何设置它。我包括了解析器。 解析器获取一个字符串并使用词法分析器对其进行标记。
标记包括值和类型。 知道如何设置节点来构建 AST?

public class Parser {
    lexer lex;
    Hashtable<String, Integer> data = new Hashtable<String, Integer>();


    public Parser( String str){
       ArrayList<Token> token = new ArrayList<Token>();

       String[] strpatt = { "[0-9]*\\.[0-9]+", //0
                            "[a-zA-Z_][a-zA-Z0-9_]*",//1
                            "[0-9]+",//2
                            "\\+",//3
                            "\\-",//4
                            "\\*",//5
                            "\\/",//6
                            "\\=",// 7
                            "\\)",// 8
                            "\\("//9
                          };

        lex = new lexer(strpatt, "[\\ \t\r\n]+");
        lex.set_data(str);
    }
    public int peek() {
      //System.out.println(lex.peek().type);
      return lex.peek().type;
    }
    public boolean peek( String[] regex) {
      return lex.peek(regex);
    }
    public void set_data( String s) {
      lex.set_data(s);
    }
    public Token scan() {
      return lex.scan();
    }
    public int goal() {
      int ret = 0;
      while(peek() != -1) {
        ret = expr();
      }
      return ret;
    }


}


【问题讨论】:

    标签: java parsing nodes abstract-syntax-tree


    【解决方案1】:

    目前,您只是在解析时进行评估:

    ret = ret * term()
    

    考虑 AST 的最简单方法是它只是一种不同类型的评估。如上所述,您不是从数字子计算中生成数字结果,而是从子计算的描述中生成计算的描述。描述被表示为包含基本信息的小结构:

    ret = BuildProductNode(ret, term());
    

    或者,也许

        ret = BuildBinaryNode(Product, ret, term());
    

    这是一棵树,因为被传递的 Node 对象引用其他 Node 对象,而没有循环或具有两个不同父节点的节点。

    显然,上面遗漏了很多细节,尤其是 Node 对象的确切性质。但这是一个粗略的轮廓。

    【讨论】:

    • 感谢您的建议,我编辑了我的帖子并添加了一个带有节点的新版本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多