2011-01-10 10 views
1

私は大きな助けが必要です。私は2つの単純なクラスツリーとノードを持っています。 ASTを作成する必要があります(抽象構文木 - ノードオブジェクトにトークンを入れ、正しい方法でTreeを埋める)。パーサーから抽象的なツリーの問題を作成する

public class Tree { 
    Node root; 
    public void AddNode(Node n){} 
    public void Evaluate(){} 
} 

public class Node { 
    public String value; 
    public int type; 
    Node left, right; 
} 

これはこの文法

%% 

%{ 
    public boolean result = true; 

    //Puni expression sa tokenima radi reimenovanja 
    public Expression expression=new Expression(); 
    // 

    public ArrayList<String> items = new ArrayList<String>(); 
    public ArrayList<Integer> extensions = new ArrayList<Integer>(); 
    // ukljucivanje informacije o poziciji tokena 
    private Symbol new_symbol(int type) { 
      return new Symbol(type, yyline+1, yycolumn); 
    } 
    // ukljucivanje informacije o poziciji tokena 
    private Symbol new_symbol(int type, Object value) { 
      return new Symbol(type, yyline+1, yycolumn, value); 
    } 
%} 

%cup 

%xstate COMMENT 

%eofval{ 
return new_symbol(sym.EOF); 
%eofval} 

%line 
%column 

%% 
" " {} 
"\b" {} 
"\t" {} 
"\r\n" {} 
"\f" {} 
"open" {extensions.add(sym.OPEN); return new_symbol(sym.OPEN);} 
"close" {extensions.add(sym.CLOSE); return new_symbol(sym.CLOSE);} 
"m_on" {extensions.add(sym.MON); return new_symbol(sym.MON);} 
"m_off" {extensions.add(sym.MOFF); return new_symbol(sym.MOFF);} 
"timeout" {extensions.add(sym.TIMEOUT); return new_symbol(sym.TIMEOUT);} 
"es_err" {extensions.add(sym.ESERR); return new_symbol(sym.ESERR);} 
"bae" {extensions.add(sym.BAE); return new_symbol(sym.BAE);} 
"i" {extensions.add(sym.I); return new_symbol(sym.I);} 
"o" {extensions.add(sym.O); return new_symbol(sym.O);} 
"bus" {extensions.add(sym.BUS); return new_symbol(sym.BUS);} 
"ext" {extensions.add(sym.EXT); return new_symbol(sym.EXT);} 
"pushb" {extensions.add(sym.PUSHB); return new_symbol(sym.PUSHB);} 
"val" {extensions.add(sym.VAL); return new_symbol(sym.VAL);} 
"ok" {extensions.add(sym.OK); return new_symbol(sym.OK);} 
"bus_br_l" {extensions.add(sym.BUS_BR_L); return new_symbol(sym.BUS_BR_L);} 
"bus_br_r" {extensions.add(sym.BUS_BR_R); return new_symbol(sym.BUS_BR_R);} 
"sh_crt_l" {extensions.add(sym.SH_CRT_L); return new_symbol(sym.SH_CRT_L);} 
"sh_crt_r" {extensions.add(sym.SH_CRT_R); return new_symbol(sym.SH_CRT_R);} 
"bus_all" {extensions.add(sym.BUS_ALL); return new_symbol(sym.BUS_ALL);} 
"ext_all" {extensions.add(sym.EXT_ALL); return new_symbol(sym.EXT_ALL);} 
"no_timeout" {extensions.add(sym.NO_TIMEOUT); return new_symbol(sym.NO_TIMEOUT);} 
"no_es_err" {extensions.add(sym.NO_ES_ERR); return new_symbol(sym.NO_ES_ERR);} 
"ibus_ok" {extensions.add(sym.IBUS_OK); return new_symbol(sym.IBUS_OK);} 
"cfg_ok" {extensions.add(sym.CFG_OK); return new_symbol(sym.CFG_OK);} 
"syntax" {extensions.add(sym.SYNTAX); return new_symbol(sym.SYNTAX);} 
"out" {extensions.add(sym.OUT); return new_symbol(sym.OUT);} 
"!" { return new_symbol(sym.NOT);} 
"&" { return new_symbol(sym.AND);} 
"|" { return new_symbol(sym.OR);} 
"(" { return new_symbol(sym.LPAREN);} 
")" { return new_symbol(sym.RPAREN);} 
([[:jletter:]])[[:jletterdigit:]]* \. {items.add(yytext().substring(0, yytext().length()-1)); return new_symbol (sym.ITEM);} 
. {result = false;} 

ProbemここからASTを作成する方法です、私は

のような入力式の何かになったパーサファイル

import java_cup.runtime.*; 

parser code {: 

    public boolean result = true; 

    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 
      ; 

ですA.open & & b.i ?誰でも助けることができますか?

答えて

1

あなたのようなprint文をコメントアウトしているあなたのパーサーの行:あなたが持っているツリーデータ構造を使用して、ASTを維持したいと思う場所

 //System.out.println("OR"); 

です。あなたの文法に基づいて、ツリーを作成するトークン、ツリーのどこかに何かを追加するなどを調べます。

+0

すばやくお返事ありがとうございます。私は文法を追加しました、申し訳ありませんが、私はあなたをよく理解していませんでした。そこに(System.printlnはどこに)追加すれば、リーフではない場合はどうなるでしょうか(例の式AND式)。簡単な例でお願いしますか? – Damir

+0

「Expression_1 AND Expression_2」の例を考えてみましょう。あなたは、左の子Expression_1と右の子Expression_2とのサブツリーANDを持ちます。 ASTでそのサブツリーを作成し、左の子をExpression_1に、右の子をExpression_2に設定する必要があります。最後に、サブツリーをルートに戻します。それは理にかなっていますか? –

+0

はい、しかし、式1が(a.i && c.open)で、式2が(d.i && e.i)ならば心配です。 d.open。私は木のリストを取得するつもりですか? – Damir

関連する問題