6
© Rob Esser May 2003 CC&P 2003 1 JJTree An easier way to create an Abstract Syntax Tree © Rob Esser May 2003 CC&P 2003 2 Lexer Parser Input character stream Token stream Analyser Code Generator Annotated AST Code Abstract Syntax Tree    T    h   e    C   o   m   p    i    l   a    t    i   o   n    T   a   s    k © Rob Esser May 2003 CC&P 2003 3 Automated? The ini tial s tages of compila tion ar e very mechanistic  – Le xe r  Text to s tream o f tokens  Patte rn ma tchin g  Parser  Application of gr ammar rules Recov ery fr om errors AST Generation Data structu re for subsequent stages © Rob Esser May 2003 CC&P 2003 4 JJTree Pre proc ess or t o Ja vaCC  Generates .jj f ile that incl udes code to bui ld an AST JJTre e genera tes code t o constr uct pars e tree nodes for each nonterminal in the language.  This beha viour ca n be modifi ed some nonter minals do no t have node s generated, or a node is generate d for a part of a produ ction's expansio n

22-JJTree2

Embed Size (px)

Citation preview

Page 1: 22-JJTree2

8/6/2019 22-JJTree2

http://slidepdf.com/reader/full/22-jjtree2 1/6

© Rob Esser May 2003

CC&P 2003 1

JJTree

An easier way to create anAbstract Syntax Tree

© Rob Esser May 2003

CC&P 2003 2

Lexer

Parser

Inputcharacter

stream

Tokenstream

Analyser

CodeGenerator

AnnotatedAST

Code

AbstractSyntax Tree

T h e C o m p i l a t i o n

T a s k

© Rob Esser May 2003

CC&P 2003 3

Automated?

• The initial stages of compilation are verymechanistic – Lexer

• Text to stream of tokens – Pattern matching

– Parser • Application of grammar rules• Recovery from errors

⇒ AST Generation• Data structure for subsequent stages

© Rob Esser May 2003

CC&P 2003 4

JJTree

• Preprocessor to JavaCC – Generates .jj file that includes code to build an AST

• JJTree generates code to construct parse tree

nodes for each nonterminal in the language. – This behaviour can be modified

• some nonterminals do not have nodes generated,• or a node is generated for a part of a production's expansion

Page 2: 22-JJTree2

8/6/2019 22-JJTree2

http://slidepdf.com/reader/full/22-jjtree2 2/6

© Rob Esser May 2003

CC&P 2003 5

JJTree

• JJTree constructs the parse tree from the bottomup

– Uses a stack to push created nodes – When a parent node is created

• it pops the children from the stack • adds them to the parent• and pushes the new parent node on the stack

– The stack can be manipulated by user code

© Rob Esser May 2003

CC&P 2003 6

Bottom up AST Generation

• -2+p("ok",3/4)-4;void expr() : {}{

[addOp()] term() ( addOp() term() )*}

addOpterm

addOpterm

addOp

addOp addOpterm

addOpterm

addOp

addOpterm

addOpterm

addOpterm

addOpterm

addOpterm

© Rob Esser May 2003

CC&P 2003 7

Bottom up AST Generation

• -2+p("ok",3/4)-4;void expr() : {}{

[addOp()] term() ( addOp() term() )*

}

expr

addOpterm

addOpterm

addOpterm

Stack

Children of expr

© Rob Esser May 2003

CC&P 2003 8

Modes

• Simple – each parse tree node is an instance of

SimpleNode

• Multi – in multi mode the type of the parse tree node is

derived from the name of the node. – If you don't provide an implementation of a

node class JJTree will generate a sampleimplementation.

Page 3: 22-JJTree2

8/6/2019 22-JJTree2

http://slidepdf.com/reader/full/22-jjtree2 3/6

© Rob Esser May 2003

CC&P 2003 9

Example 1

• Only modify initial production – from

void start() : {}{

expr() ";"}

– toSimpleNode start() : {}{

expr() ";"{ return jjtThis; }

}

© Rob Esser May 2003

CC&P 2003 10

Example 1

• Generates the following AST where all nodes areinstances of SimpleNode, eg. -2+p("ok",3/4)-4

start

expraddOpterm

factorprimary

numberaddOpterm

factorprimary

ident…

A literal

A literal

© Rob Esser May 2003

CC&P 2003 11

Creating Nodes

• A definite node – constructed with a specific number of

children. – That many nodes are popped from the stack

and made the children of the new node, whichis then pushed on the stack itself.

– #ADefiniteNode(INTEGER EXPRESSION)

© Rob Esser May 2003

CC&P 2003 12

Creating Nodes

• A conditional node – is constructed with all of the children on the

stack if its condition evaluates to true. – If it evaluates to false, the node is not

constructed.– #ConditionalNode(BOOLEAN EXPRESSION)

Page 4: 22-JJTree2

8/6/2019 22-JJTree2

http://slidepdf.com/reader/full/22-jjtree2 4/6

© Rob Esser May 2003

CC&P 2003 13

Creating Nodes

• By default JJTree treats each nonterminalas an indefinite node and derives the nameof the node from the name of its

production. – You can give it a different name with the

following syntax:– void P1() #MyNode : { ... } { ... }

© Rob Esser May 2003

CC&P 2003 14

Example 2

• Create specific node classes for literals, eg. identpublic class ASTident extends SimpleNode {

private String text;

public ASTident(int id) {super(id);

}public ASTident(Expression p, int id) {

super(p, id);}public void setText(String n) {

text = n;}public String toString() {

return "ident: " + text;}

}

StandardConstructors

Instance variable

(ident text)

Accessor method

To complete the job

© Rob Esser May 2003

CC&P 2003 15

Example 2

• Modify .jjt file to create/allow nodes for each nonterminal production

options {MULTI=true;

} – And to capture literals

void ident() :{ Token t; }{

t=<IDENTIFIER>{

jjtThis.setText(t.image);}

}

Implicitly refers tospecific active node

(ASTident)

© Rob Esser May 2003

CC&P 2003 16

Example 2

• Generates the following AST where all nodes are instancesof Unique classes extending SimpleNode, eg.-2+p("ok",3/4)-4

startexpr

addOpterm

factorprimary

number: 2addOpterm

factorprimary

ident: prvalue

string: "ok"

rvalueexpr

termfactor

primarynumber: 3

multopfactor

primarynumber: 4

addOpterm

factorprimary

number: 4

Page 5: 22-JJTree2

8/6/2019 22-JJTree2

http://slidepdf.com/reader/full/22-jjtree2 5/6

© Rob Esser May 2003

CC&P 2003 17

Example 3

• Generates a "useful" AST where all nodes areinstances of unique classes extending

SimpleNode, eg.-2+p("ok",3/4)-4start

MinusNodeAddNode

MinusNodenumber: 2

ident: pparameterList

string: "ok"DivideNode

number: 3number: 4

number: 4

-

+

-

2

P

4

PL

"ok" /

3 4

© Rob Esser May 2003

CC&P 2003 18

Example 3

• The task is to only generate nodes whereappropriate and generate an AST with asuitable shape.

• Remove superfluous intermediate nodesvoid rvalue() #void : {}

{

expr() | string()

}Does not

generate a node

© Rob Esser May 2003

CC&P 2003 19

Example 3

• Generate only appropriate nodesvoid addOp() #void : {}

{

"+" #AddNode | "-" #MinusNode

}

Does not generate anaddOp node

But does generate either an AddNode or

MinusNode

© Rob Esser May 2003

CC&P 2003 20

Example 3• Reorder nodes

void expr() #void :{

Node unaryOp = null;}{

[addOp() {unaryOp = jjtree.popNode();}] term() {if (unaryOp != null) {

unaryOp.jjtAddChild(jjtree.popNode(),0);jjtree.pushNode(unaryOp);

}} ( addOp() term() {

Node n1,n2,op;n2 = jjtree.popNode();op = jjtree.popNode();n1 = jjtree.popNode();op.jjtAddChild(n1,0);op.jjtAddChild(n2,1);jjtree.pushNode(op);

} )*}

If a unary operation existsmake the following term a

child of it

Restructure tree with a binary operator having

exactly 2 children

Page 6: 22-JJTree2

8/6/2019 22-JJTree2

http://slidepdf.com/reader/full/22-jjtree2 6/6

© Rob Esser May 2003

CC&P 2003 21

More features of JJTree

• Visitor design pattern support – JJTree can insert an jjtAccept() method into

all of the node classes it generates, and alsogenerate a visitor interface

© Rob Esser May 2003

CC&P 2003 22

Questions

• How would a pretty printer be implementedusing the visitor design pattern generationof JJTree?