21.03.2015 Views

MiniJava Abstract Syntax

MiniJava Abstract Syntax

MiniJava Abstract Syntax

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

CS 5470<br />

Compiler Techniques and Principles<br />

January 29, 2010 — LECTURE 8<br />

Parsing <strong>MiniJava</strong><br />

<strong>Abstract</strong> syntax for <strong>MiniJava</strong>


<strong>MiniJava</strong> Grammar (1)<br />

ClassDecl class id { VarDecl* MethodDecl* }<br />

ClassDecl class id extends id { VarDecl* MethodDecl* }<br />

●<br />

Is this fragment of the grammar LL(1)?<br />

●<br />

LL(2)?<br />

CS 5470—Lecture 8 2


<strong>MiniJava</strong> Grammar (2)<br />

MethodDecl public ... { VarDecl* Statement* ... }<br />

VarDecl Type id ;<br />

Type int []<br />

Type boolean<br />

Type int<br />

Type id<br />

Statement { Statement* }<br />

Statement if ( Exp ) Statement else Statement<br />

Statement while ( Exp ) Statement<br />

Statement System.out.println ( Exp ) ;<br />

Statement id = Exp ;<br />

Statement id [ Exp ] = Exp ;<br />

Is this fragment of the grammar LL(1)? LL(2)?<br />

CS 5470—Lecture 8 3


<strong>MiniJava</strong> Grammar (3)<br />

Exp Exp op Exp<br />

Exp Exp [ Exp ]<br />

Exp Exp . length<br />

Exp Exp . id ( ExpList )<br />

Exp INTEGER_LITERAL<br />

Exp true<br />

Exp false<br />

Exp id<br />

Exp this<br />

Exp new int [ Exp ]<br />

Exp new id ( )<br />

Exp ! Exp<br />

Exp ( Exp )<br />

●<br />

Is this fragment of the<br />

grammar LL(1)?<br />

●<br />

LL(2)?<br />

CS 5470—Lecture 8 4


<strong>MiniJava</strong> <strong>Abstract</strong> <strong>Syntax</strong><br />

<strong>Abstract</strong> classes for some nonterminals:<br />

ClassDecl, Type, Statement, Exp<br />

Subclasses for each of their production rules:<br />

such as ClassDeclSimple, IntegerType, If, Not<br />

Classes for nonterminals with only one production rule:<br />

Program, MainClass, VarDecl, MethodDecl, Formal<br />

List classes:<br />

ClassDeclList, ExpList, FormalList,<br />

MethodDeclList, StatementList, VarDeclList<br />

CS 5470—Lecture 8 5


An <strong>Abstract</strong> <strong>Syntax</strong> Class<br />

Object field variables representing the nonterminals, identifiers,<br />

and integer literals in right side of the production rule.<br />

Constructor with arguments corresponding to the field variables.<br />

Several accept() methods, used in the parser, checker, and IRtree<br />

generator.<br />

** For a production rule whose right side has only terminals that<br />

are not identifiers or integer literals, its syntax class has no field<br />

variables.<br />

CS 5470—Lecture 8 6


List Classes<br />

All list classes are treated similarly, using the Vector object.<br />

public class StatementList {<br />

private Vector list;<br />

public StatementList() {list = new Vector();}<br />

public void addElement(Statement n)<br />

{list.addElement(n);}<br />

public Statement elementAt(int i)<br />

{return (Statement)list.elementAt(i);}<br />

public int size() {return list.size();}<br />

}<br />

** Notice the lack of an accept() method.<br />

CS 5470—Lecture 8 7


Example: <strong>MiniJava</strong> Statement<br />

if (x < 0) {<br />

y = my_obj.my_method(1);<br />

z = new my_class();<br />

}<br />

else<br />

x = 0;<br />

What Java code will build the AST for this statement?<br />

CS 5470—Lecture 8 8


if (x < 0) {<br />

else<br />

y = my_obj.my_method(1);<br />

z = new my_class(); }<br />

x = 0;<br />

ExpList el = new ExpList();<br />

el.addElement(new IntegerLiteral(1));<br />

StatementList sl = new StatementList();<br />

sl.addElement(new Assign(new Identifier(“y”),<br />

new Call(new IdentifierExp(“my_obj”),<br />

new Identifier(“my_method”), el)));<br />

sl.addElement(new Assign(new Identifier(“z”),<br />

new NewObject(new Identifier(“my_class”))));<br />

Statement s = new If(new LessThan(<br />

new IdentifierExp(“x”),<br />

new IntegerLiteral(0)), new Block(sl),<br />

new Assign(new Identifier(“x”),<br />

new IntegerLiteral(0)));


Provided Visitors<br />

The interface Visitor, containing a visit() method for<br />

each syntax class that returns void.<br />

PrettyPrintVisitor implements Visitor<br />

●<br />

each visit() method for a syntax class calls the<br />

accept() method for each of its object field<br />

variables<br />

●<br />

list classes have no accept() methods, uses<br />

elementAt() method inside a for loop<br />

●<br />

prints formatted version of code for each syntax class<br />

CS 5470—Lecture 8 10


PrettyPrintVisitor<br />

public void visit(ArrayAssign n) {<br />

// call accept for Identifier i<br />

n.i.accept(this);<br />

System.out.print("[");<br />

// call accept for Exp e1<br />

n.e1.accept(this);<br />

System.out.print("] = ");<br />

// call accept for Exp e2<br />

n.e2.accept(this);<br />

System.out.print(";");<br />

}<br />

CS 5470—Lecture 8 11


PrettyPrintVisitor<br />

public void visit(Block n) {<br />

System.out.println("{ ");<br />

// call accept for each Statement in list<br />

for ( int i = 0; i < n.sl.size(); i++ ) {<br />

System.out.print(" ");<br />

n.sl.elementAt(i).accept(this);<br />

System.out.println();<br />

}<br />

System.out.print(" } ");<br />

}<br />

CS 5470—Lecture 8 12

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!