Documentos de Académico
Documentos de Profesional
Documentos de Cultura
4 Acciones agregadas en un
analizador sintáctico descendente
(top-down)
S E$ E T E’ E’ + T E’ E’ - T E’ E’ l
T F T’ T’ * F T’ T’ / F T’ T’ l
F id F num F (E)
Los tokens ID y NUM deben ahora acarrear valores de tipo string e int,
respectivamente. Asumiremos que existe una tabla “lookup” que mapea
identificadores a enteros. El tipo asociado con E, T, F, etc., es int, y la acción semántica
es fácil de implementar.
Interprete
Acciones semánticas
class Token2 {
int kind; Object val;
Token2(int k, Object v) int T() {switch(tok.kind) {
{ case ID:
kind=k; case NUM:
val=v; case LPAREN: return Tprime(F());
} default: print("2 esperaba ID, NUM o parent izq");
} //skipto(T_follow);
final int EOF=0, ID=1, NUM=2, PLUS=3, return 0;
MINUS=4,LPAREN=5, RPAREN=6, TIMES=7; }}
int lookup(String id) { …. }
int F_follow[] = {PLUS,TIMES,RPAREN,EOF}; int Tprime(int a) {switch (tok.kind) {
case TIMES: eat(TIMES); return Tprime(a*F());
int F() {switch(tok.kind) { case PLUS:
case ID: int i=lookup((String)(tok.val));advance()return i; case RPAREN:
case NUM: int i=((integer)(tok.val)).intVal(); case EOF: return a;
advance();return i; default: print("3 esperaba ID, NUM o parent izq");
case LPAREN: eat(LPAREN); //skipto(T_follow);
int i=E(); return 0;
eatOrSkipTo(RPAREN,F_follow); }}
return i;
case EOF: void eatOrSkipTo(int expected, int[] stop) {
default: print("1 esperaba ID,NUM, o parent izq"); if (tok.kind==expected)
//skipto(F_follow); return 0; eat(expected);
}} else {print("4 esperaba ID, NUM o parent izq");
//skipto(stop);}
int T_follow[]= {PLUS,RPAREN,EOF}; }
Parser Automáticamente generado
• Una especificación del parser para javaCC consistiría de un conjunto de reglas gramaticales,
cada una anotada o agregada con una acción semántica el cual sería un estatuto java.
Ejemplo:
Árbol
Est-if
Árbol If-then-else De
sintáctico parsing
B S1 S2
E + T
T * F F
F 4 8
2 +
Cuyo árbol sintáctico abstracto sería: * 8
2 4
Ejemplo:
• La gramática siguiente nos muestra una sintaxis abstracta
de un lenguaje para expresiones:
EE+E EE-EEE*E
EE/E Eid Enum
• Esta gramática es impráctica para un parser ya que es
ambigua pues no tiene precedencia de operadores.
• Sin embargo, esta gramática no es para el parser. El
analizador semántico podría usarla el cual no se molesta
por la ambiguedad puesto que ya tiene su arbol.
Árboles de Sintaxis en Java
• En Java las estructuras de datos para el árbol
de sintaxis contienen una clase abstracta para
cada noterminal y una subclase para cada
producción. Así, las clases de el programa
siguiente son las clases de la sintaxis abstracta
para la gramática de la diapositiva anterior.
Programa de clases para Exp
public abstract class ExpCh4 {
public abstract int eval();
}
class PlusExp extends ExpCh4 {
private ExpCh4 e1,e2; class DivideExp extends ExpCh4 {
public PlusExp(ExpCh4 a1, ExpCh4 a2) private ExpCh4 e1,e2;
{e1=a1; e2=a2;} public DivideExp(ExpCh4 a1, ExpCh4 a2)
public int eval() { {e1=a1; e2=a2;}
return e1.eval()+e2.eval(); public int eval() {
} return e1.eval()/e2.eval();
} }
class MinusExp extends ExpCh4 { }
private ExpCh4 e1,e2; class Identifier extends ExpCh4 {
public MinusExp(ExpCh4 a1, ExpCh4 a2) private String f0;
{e1=a1; e2=a2;} public Identifier(String n0) {f0=n0;}
public int eval() { public int eval() {
return e1.eval()-e2.eval(); return (7); //return lookup(f0);
} }
} }
class TimesExp extends ExpCh4 { class IntegerLiteral extends ExpCh4 {
private ExpCh4 e1,e2; private String f0;
public TimesExp(ExpCh4 a1, ExpCh4 a2) public IntegerLiteral(String n0) {f0=n0;}
{e1=a1; e2=a2;} public int eval() {
public int eval() { return (4);
return e1.eval()*e2.eval(); //return Integer.parseInt(f0);
} }
} }
(cont.)
• Ahora veamos un intérprete para el lenguaje de expresiones de la gramática de sección 4.1.1.
Por conveniencia la mostramos de nuevo.
S E$
ETE ’ E’ + T E’ E’ - T E’ E’ l
T F T’ T’ * F T’ T’ / F T’ T’ l
F id F num F (E)
PARSER_BEGIN(InterSinTree)
class InterSinTree {}
PARSER_END(InterSinTree)
VarDecl(Type t, Identifier i)
MethodDecl(Type t, Identifier i, FormalList fl, VarDeclList vl, StatementList,
Exp e)
Formal(Type t, Identifier i)
Identifier(String s)
List classes
ClassDeclList() ExpList() FormalList() MethodDeclList()
StatementList() VarDeclList()
Arbol Sintáctico
• Cada una de las clases que no son listas tiene
un método accept para usarse con el patrón
visitador. La interface Visitador se muestra en
la siguiente diapositiva.
public interface Visitor {
public void visit(Program n);
public void visit(MainClass n);
public void visit(ClassDeclSimple n);
public void visit(ClassDeclextends n);
public void visit(VarDecl n);
public void visit(MethodDecl n);
public void visit(Formal n);
public void visit(IntArrayType n);
public void visit(BooleanType n);
public void visit(IntegerType n);
public void visit(IdentifierType n);
public void visit(Block n);
Visitador public void visit(If n);
public void visit(While n);
MiniJava public void visit(Print n);
public void visit(Assign n);
public void visit(ArrayAssign n);
public void visit(And n);
public void visit(LessThan n);
public void visit(Pluss n);
public void visit(Minus n);
public void visit(Times n);
public void visit(ArrayLoockup n);
public void visit(ArrayLength n);
public void visit(Call n);
public void visit(IntegerLiteral n);
public void visit(True n);
public void visit(False n);
public void visit(IdentifierExp n);
public void visit(This n);
public void visit(NewArray n);
public void visit(NewObject n);
public void visit(Not n);
public void visit(Identifier n);
}
(cont. Arbol Sintáctico)
• Podemos construir un árbol sintáctico usando expresiones new anidadas.
Por ejemplo el árbol sintáctico para el estatuto MiniJava:
x = y.m(1,4+5);