Witam,

Celem zadania jest stworzenie interpretera deklaracji zmiennych, przypisania oraz wykonywania na nich dzialan arytmetycznych. ponadto program powinien wypisywac z jakich komend korzystal - w tym celu drzewo powinno wywolywac "metody" zdefiniowane w pliku stg. aktualnie program wszystko inicjuje poprawnie, wypisuje rezultat dzialan, jednak nie moge sobie poradzic z wywolywaniem metod z pliku stg, ponizej kod:

Expr.g

 grammar Expr;

options {
  output=AST;
  ASTLabelType=CommonTree;
}
@header {
  import java.util.HashMap;
}
@members {
  private java.util.HashMap<String, Integer> memory = new java.util.HashMap<String, Integer>();

  @Override
  public void reportError(RecognitionException e) {
    throw new RuntimeException("I quit!\n" + e.getMessage()); 
  }
}
@lexer::header {

}

prog
    : (stat )+ EOF!; 

stat: // evaluate expr and emit result
      // $expr.value is return attribute 'value' from expr call
      expr NEWLINE {System.out.println($expr.value);}
      // match assignment and stored value
      // $ID.text is text property of token matched for ID reference
      | 'int' ID '=' expr NEWLINE
      {
        if (memory.get($ID.text) != null) {
          throw new RuntimeException("error: redeclaration variable "+$ID.text);
        } else {
          memory.put($ID.text, new Integer($expr.value));
        }
      }
      | ID '=' expr NEWLINE
      {
        if (memory.get($ID.text) == null) {
          throw new RuntimeException("error: variable "+$ID.text+" does nt exist!");
        } else {
          memory.put($ID.text, new Integer($expr.value));
        }
      }
      // do nothing: empty statement
      | NEWLINE
      ;


expr returns [int value]
      : e=multExpr {$value = $e.value;}
      ( '+' e=multExpr {$value += $e.value;}
      | '-' e=multExpr {$value -= $e.value;}
      )*
      ;


/** return the value of an atom or, if '*' present, return
* multiplication of results from both atom references.
* $value is the return value of this method, $e.value
* is the return value of the rule labeled with e.
*/
multExpr returns [int value]
      : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*
      ;

      
atom returns [int value]
      : // value of an INT is the int computed from char sequence
      INT {$value = Integer.parseInt($INT.text);}
      | ID // variable reference
      {
        // look up value of variable
        Integer v = (Integer)memory.get($ID.text);
        // if found, set return value else error
        if ( v!=null ) $value = v.intValue();
        else System.err.println("undefined variable "+$ID.text);
      }
      // value of parenthesized expression is just the expr value
      | '(' expr ')' {$value = $expr.value;}
      ;


ID : ('a'..'z' |'A'..'Z' )+ ;
INT : '0'..'9' + ;
NEWLINE:'\r' ? '\n' ;
WS : (' ' |'\t' |'\n' |'\r' )+ {skip();} ;

TExpr.g

tree grammar TExpr;
options {
  tokenVocab=Expr;
  ASTLabelType=CommonTree;
   output=template;
  }
 
@header {
}
@members {
}
prog    : e+=expr* -> template(name={$e}) "<name;separator=\" aaa!!! \">";
expr    : ^(ID '=' e1=expr NEWLINE)  ->declare(i={$e1.st})
        ; 

plik stg

group pierwszy;

declare(i) ::="Declaration #<i> value"

int(i) ::="MOV A, #<i>"


add(p1,p2) ::= <<
<p2>
PUSH A
<p1>
POP B
ADD A,B
>>

z gory dzieki za pomoc