«« ( Date ) »» // «« ( Thread ) »» // ri4pp - 2006

Re: Pitanje za asistenta (lex, CUP)

by Jovan Popovic
ponedeljak, 22. maj 2006 - 14:16.

Pogledajte CUP/ByaccJ primere za ovo ili vezbe atributivno translacione
gramatike. Kada hocete da pristupite atributu terminala / neterminala iza
njega deklarisete kako ce se taj atribut zvati u kodu i pristupate mu
preko te promenljive. Primer iz CUP-a:

expr ::= expr:e1 PLUS expr:e2
{: RESULT = new Integer(e1.intValue() + e2.intValue()); :}
expr ::= ID:val {: System.out.println(val); :}


Ovde je e1 atribut prvog expr-a a e2 atribut drugog expr-a (to je
definisano u expr:e1 i expr:e2). CUP ce generisati lokalne promenljive e1
i e2 preko kojih mozete pristupiti atributima. U kodu koji predstavlja
java akciju preko promenljivih e1 i e2 pristupate vrednostima
promenljivih.
Pri tome u deklaraciji (ne)terminala stavite koji je tip promenljive npr.

terminal String ID;
terminal Integer NUMBER;
nonterminal Item expr;

U BYaccJ-u koristite $1 $2 umesto imena atributa.

Nema potrebe da koristite stek direktno.

Pozdrav,
Jovan


> Da li se ovako u CUP- u dolazi do objekta Symbol kreiranog tokom
> leksicke analize:
>
> const_part ::= IDENT EQUALS rhs
> {:
> Obj newObj = new Obj();
> *newObj.name = CUP$parser$stack.peek().toString();*
> newObj.kind = IObj.CONSTANT;
> :};
>
>