17
Introduction to the 1st Obligatory Exercise Scanning, parsing, constructing the abstract syntax tree Department of Informatics University of Oslo Compiler technique, Friday 22 2013 (Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 1 / 17

Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

  • Upload
    vananh

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Introduction to the 1st Obligatory ExerciseScanning, parsing, constructing the abstract syntax tree

Department of InformaticsUniversity of Oslo

Compiler technique, Friday 22 2013

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 1 / 17

Page 2: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Scanner and Parser GeneratorsJFlex

JFlexIs specified in .lex fileSpecification consists of three parts:

I User codeI Options and macrosI Lexical rules

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 2 / 17

Page 3: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Scanner and Parser GeneratorsJFlex

package oblig1parser;import java_cup.runtime.*;

%%

%unicode%cup

%{ private Symbol symbol(int type) { return new Symbol(type, yyline, yycolumn); }%}

Identifier = [:jletter:] [:jletterdigit:]*

%%

<YYINITIAL> { "class" { return symbol(sym.CLASS); } {Identifier} { return symbol(sym.ID, yytext()); }}

USER CODE

OPTIONS / MACROS

LEXICAL RULES

Code copied to Lexer.java

Lexical State

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 3 / 17

Page 4: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Scanner and Parser GeneratorsCUP

Java Based Constructor of Useful Parsers (CUP)Is specified in .cup fileSpecification consists of five parts:

I Package and import specificationsI User code componentsI Symbol listI Prcedence declarationsI Grammar

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 4 / 17

Page 5: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Scanner and Parser GeneratorsCUP

PACKAGE /IMPORTS

SYMBOL LIST

GRAMMAR

Code copied to parser.java

package oblig1parser;import java_cup.runtime.*;import syntaxtree.*;

parser code {: :};

terminal CLASS;terminal String ID;

non terminal ClassDecl class_decl, decl;

precedence left OR;precedence left AND;

program::= decl_list:dl {: RESULT = new Program(dl); :} ;

decl_list ::= decl:d {: List<ClassDecl> l = new LinkedList<ClassDecl>(); l.add(d); RESULT = l; :} | decl_list:dl decl:d {: dl.add(d); RESULT = dl; :} ;

decl ::= class_decl:sd {: RESULT = sd; :} ; class_decl ::= CLASS ID:name LBRACK RBRACK {: RESULT = new ClassDecl(name); :}

USER CODE

PRECEDENCEDECLARATIONS

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 5 / 17

Page 6: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Scanner and Parser GeneratorsCUP

PACKAGE /IMPORTS

SYMBOL LIST

GRAMMAR

package oblig1parser;import java_cup.runtime.*;import syntaxtree.*;

parser code {: :};

terminal CLASS;terminal String ID;

non terminal ClassDecl class_decl, decl;

precedence left OR;precedence left AND;

program::= decl_list:dl {: RESULT = new Program(dl); :} ;

decl_list ::= decl:d {: List<ClassDecl> l = new LinkedList<ClassDecl>(); l.add(d); RESULT = l; :} | decl_list:dl decl:d {: dl.add(d); RESULT = dl; :} ;

decl ::= class_decl:sd {: RESULT = sd; :} ; class_decl ::= CLASS ID:name LBRACK RBRACK {: RESULT = new ClassDecl(name); :} ;

USER CODE

PRECEDENCEDECLARATIONS

1.2.

3. 4.5.

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 6 / 17

Page 7: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Scanner and Parser GeneratorsCUP

ConflictsTwo types of conflicts may occur:

Shift-Reduce in which CUP chooses to reduceReduce-Reduce in which CUP chooses first rule

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 7 / 17

Page 8: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Scanner and Parser GeneratorsIntegration

JFLEXJFLEX CUPCUPSymbol

public interface sym{ public static final int NOT = 36; public static final int AND = 21; public static final int RPAR = 42; public static final int COMMA = 37; public static final int CLASS = 2; public static final int REFERENCE = 5; …}

"class" { return symbol(sym.CLASS); }

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 8 / 17

Page 9: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Abstract syntax tree modelUsing Java

Each required node in the tree model is represented by a Java class

package syntaxtree.nonterminals;import java.util.List;import utils.Utils;

public class ClassDecl extends Decl { private String name; private List<VarDecl> varDecls;

public ClassDecl( String name, List<VarDecl> varDecls ) { this.name = name; this.varDecls = varDecls;}

public void extractAST( StringBuilder sb, String indent ) { sb.append( "\n" + indent + "(CLASS_DECL (NAME " + name + ")" ); ... }}

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 9 / 17

Page 10: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Overview of provided code

buildbuild

grammarsgrammars

input-examplesinput-examples

liblib

oblila-astoblila-ast

oblila-codeoblila-code

srcsrc

src-examplessrc-examples

src-gensrc-gen

Class files for compiler, lexer, parser, syntaxtree, etc.

Three pairs of .lex/.cup files

Test file for example parser

JFlex and CUP libs

Generated abstract syntax tree

Oblila source code

Java source code for compiler, syntax tree, etc.

Java source code example syntax tree

Generated Java source code for lexer and parser

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 10 / 17

Page 11: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Overview of provided codegrammars

grammarsgrammars

Three pairs of .lex/.cup files

Three grammar pairsexpression-eval (example expression language)expression-par (example language handling parentheses)oblig1 (oblig grammars)

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 11 / 17

Page 12: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Overview of provided codeoblila-ast

oblila-astoblila-ast

Generated abstract syntax tree

One abstract syntax treeOblila.ast

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 12 / 17

Page 13: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Overview of provided codeoblila-code

oblila-codeoblila-code

Oblila source code

One Oblila source fileOblila.obl

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 13 / 17

Page 14: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Overview of provided codesrc

srcsrc

Java source code for compiler, syntax tree, etc.

Two folderscompilersyntaxtree

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 14 / 17

Page 15: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Using build scriptAnt

Ant targetsbuild.xml contains an Ant-based build script with targets and taskdefinitions

$ ant clean$ ant build$ ant run...

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 15 / 17

Page 16: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

The tasks of this assignment

Three main partsCreate JFlex specificationCreate CUP specification (two versions)Define abstract syntax tree model using Java

package oblig1parser;import java_cup.runtime.*;

%%

%unicode%cup

%{ private Symbol symbol(int type) { return new Symbol(type, yyline, yycolumn); }%}

Identifier = [:jletter:] [:jletterdigit:]*

%%

<YYINITIAL> { "class" { return symbol(sym.CLASS); } {Identifier} { return symbol(sym.ID, yytext()); }}

USER CODE

OPTIONS / MACROS

LEXICAL RULES

Code copied to Lexer.java

Lexical State

PACKAGE /IMPORTS

SYMBOL LIST

GRAMMAR

Code copied to parser.java

package oblig1parser;import java_cup.runtime.*;import syntaxtree.*;

parser code {: :};

terminal CLASS;terminal String ID;

non terminal ClassDecl class_decl, decl;

precedence left OR;precedence left AND;

program::= decl_list:dl {: RESULT = new Program(dl); :} ;

decl_list ::= decl:d {: List<ClassDecl> l = new LinkedList<ClassDecl>(); l.add(d); RESULT = l; :} | decl_list:dl decl:d {: dl.add(d); RESULT = dl; :} ;

decl ::= class_decl:sd {: RESULT = sd; :} ; class_decl ::= CLASS ID:name LBRACK RBRACK {: RESULT = new ClassDecl(name); :}

USER CODE

PRECEDENCEDECLARATIONS

package syntaxtree.nonterminals;import java.util.List;import utils.Utils;

public class ClassDecl extends Decl { private String name; private List<VarDecl> varDecls;

public ClassDecl( String name, List<VarDecl> varDecls ) { this.name = name; this.varDecls = varDecls;}

public void extractAST( StringBuilder sb, String indent ) { sb.append( "\n" + indent + "(CLASS_DECL (NAME " + name + ")" ); ... }}

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 16 / 17

Page 17: Introduction to the 1st Obligatory Exercise - Forsiden · Introduction to the 1st Obligatory Exercise ... Define abstract syntax tree model using Java ... (S t ring m,Lv

Additional information

More informationExercise and Oblila descriptionsJFlex manualCUP manual

(Department of Informatics, UiO) Introduction to the 1st Obligatory Exercise INF5110/9110 2013 17 / 17