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