Нужна помощь в создании AST из чашки на Java - PullRequest
1 голос
/ 16 марта 2011

Мне нужно создать AST в моем коде.Я создал классы Node и AST как вспомогательный класс.

public class Node {
    private String value;
    private String type;
    private Boolean visited;
    private Node leftChild, rightChild;

    public Node(){
        value="";
        type="";
        visited=false;
    }

    public Node(String value, String type, Boolean visited, Node  leftChild, Node rightChild){
        this.value=value;
        this.type=type;
        this.visited=visited;
        this.leftChild=leftChild;
        this.rightChild=rightChild;
    }

    public Node(String value, String type, Boolean visited){
        this.value=value;
        this.type=type;
        this.visited=visited;
    }

    public Node(String value, String type,Boolean visited, Node leftChild){
        this.value=value;
        this.type=type;
        this.visited=visited;
        this.leftChild=leftChild;
        this.rightChild=null;
    }

    public Node(String value, String type, Node leftChild){
        this.value=value;
        this.type=type;
        this.visited=false;
        this.leftChild=leftChild;
        this.rightChild=null;
    }


    public void SetValue(String value){this.value=value;}
    public String GetValue(){return value;}
    public void SetType(String type){this.type=type;}
    public String GetType(){return type;}
    public void SetVisited(Boolean visited){this.visited=visited;}
    public Boolean GetVisited(){return visited;}

    public Node GetLeftChild(){return leftChild;}
    public void SetLeftChild(Node leftChild){this.leftChild=leftChild;}
    public void SetRightChild(Node rightChild){this.rightChild=rightChild;}
    public Node GetRightChild(){return rightChild;}

    public String EvaluateToString(){
        String temp="";
        if(leftChild!=null)
            temp+=leftChild.EvaluateToString();
        temp+=value;
        if(rightChild!=null)
            temp+=rightChild.EvaluateToString();
        return temp;
    }

}


public class AST {

    private Node root=null;
    private Stack<Node> stack=null;

    public AST(){
        root=null;
        stack=new Stack<Node>();
    }

    public Node GetRoot(){return root;}
    public void SetRoot(Node root){this.root=root;}

    public String GetExpression(){
        return root.EvaluateToString();
    }
}

Это моя чашка

import java_cup.runtime.*;

parser code {:

    public boolean result = true; 

    /***************************************************************************
    * following are redefined methods for error reporting on message text change
    /***************************************************************************
    public void report_fatal_error(String message, Object   info) throws java.lang.Exception {
        done_parsing();
        System.out.println("report_fatal_error");
        report_error();
    }

    public void syntax_error(Symbol cur_token) {
        System.out.println("syntax_error");
        report_error();
    }

    public void unrecovered_syntax_error(Symbol cur_token) throws java.lang.Exception {
        System.out.println("unrecovered_syntax_error");
        report_fatal_error("Fatalna greska, parsiranje se ne moze nastaviti", cur_token);
    }

    public void report_error(){
        System.out.println("report_error");
        result = false;
    }

:}

init with {: result = true; :};

/* Terminals (tokens returned by the scanner). */
terminal           AND, OR, NOT;
terminal           LPAREN, RPAREN;
terminal           ITEM;
terminal           OPEN, CLOSE, MON, MOFF, TIMEOUT, ESERR, BAE, I, O, BUS, EXT, PUSHB;
terminal           VAL, OK, BUS_BR_L, BUS_BR_R, SH_CRT_L, SH_CRT_R, BUS_ALL, EXT_ALL, NO_TIMEOUT, NO_ES_ERR, IBUS_OK, CFG_OK, SYNTAX;
terminal           OUT;

/* Non-terminals */
non terminal        extension;
non terminal Integer    expr;

/* Precedences */
precedence left AND, OR;

/* The grammar */

expr      ::= 
          |
            expr:e1 AND expr:e2 
          {: 
            //System.out.println("AND");
            RESULT = 1; 
            :} 
          | 
              expr:e1 OR expr:e2 
          {: 
            //System.out.println("OR"); 
            RESULT = 2; 
            :} 
          | 
              NOT expr:e1
          {: 
            //System.out.println("NOT");
            RESULT = 3; 
            :}
          | 
              LPAREN expr:e RPAREN     
          {: 
            //System.out.println("()");
            RESULT = 4; 
            :} 
          | 
              ITEM extension:e1
          {: 
            //System.out.println("ITEM."); 
            RESULT = 5; 
            :}
          | 
              error
          {: 
            System.out.println("error"); 
            parser.report_error();
            RESULT = 0; 
            :}
          ;

extension ::= 
              OPEN
          |   
              MON
          |   
              CLOSE
          |
              MOFF
          |
              TIMEOUT
          |
              ESERR
          |
              BAE
          |
              I
          |
              O
          |
              BUS
          |
              EXT
          |
              PUSHB
          |
              VAL
          |
              OK
          |
              BUS_BR_L
          |
              BUS_BR_R
          |
              SH_CRT_L
          |
              SH_CRT_R
          |
              BUS_ALL
          |
              EXT_ALL
          |
              NO_TIMEOUT
          |
              NO_ES_ERR
          |
              IBUS_OK
          |
              CFG_OK 
          |
              SYNTAX
          | 
              OUT
          ;

Что изменить в чашке, чтобы получить AST?Кто-нибудь может помочь, пожалуйста?

1 Ответ

0 голосов
/ 13 мая 2011
/* Non-terminals */
non terminal        extension;
non terminal Integer    expr;

Здесь Integer - тип выражения, вы должны изменить его на Node;

    expr:e1 AND expr:e2 
      {: 
        //System.out.println("AND");
        RESULT = 1; 
        :} 

Здесь вы можете построить синтаксическое дерево:

    expr:e1 AND expr:e2 
      {: 
        RESULT = new Node("", "AND", e1, e2); 
        :} 
...