Compiler Compiler Tutorial



Similar documents
Compiler Construction

How Compilers Work. by Walter Bright. Digital Mars

Compiler Construction

CA Compiler Construction

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 20: Stack Frames 7 March 08

Scoping (Readings 7.1,7.4,7.6) Parameter passing methods (7.5) Building symbol tables (7.6)

Intel Assembler. Project administration. Non-standard project. Project administration: Repository

Compilers. Introduction to Compilers. Lecture 1. Spring term. Mick O Donnell: michael.odonnell@uam.es Alfonso Ortega: alfonso.ortega@uam.

The previous chapter provided a definition of the semantics of a programming

Massachusetts Institute of Technology Department of Electrical Engineering and Computer Science

ANTLR - Introduction. Overview of Lecture 4. ANTLR Introduction (1) ANTLR Introduction (2) Introduction

COMP 356 Programming Language Structures Notes for Chapter 4 of Concepts of Programming Languages Scanning and Parsing

Lecture 9. Semantic Analysis Scoping and Symbol Table

Introduction. Compiler Design CSE 504. Overview. Programming problems are easier to solve in high-level languages

Programming Project 1: Lexical Analyzer (Scanner)

Programming Languages CIS 443

Programming Assignment II Due Date: See online CISC 672 schedule Individual Assignment

Language Processing Systems

Compiler I: Syntax Analysis Human Thought

CSCI 3136 Principles of Programming Languages

Antlr ANother TutoRiaL

X86-64 Architecture Guide

Theory of Compilation

1 Introduction. 2 An Interpreter. 2.1 Handling Source Code

Massachusetts Institute of Technology Department of Electrical Engineering and Computer Science

A TOOL FOR DATA STRUCTURE VISUALIZATION AND USER-DEFINED ALGORITHM ANIMATION

Assembly Language: Function Calls" Jennifer Rexford!

C Compiler Targeting the Java Virtual Machine

How to make the computer understand? Lecture 15: Putting it all together. Example (Output assembly code) Example (input program) Anatomy of a Computer

Fighting malware on your own

Hacking Techniques & Intrusion Detection. Ali Al-Shemery arabnix [at] gmail

Textual Modeling Languages

Semantic Analysis: Types and Type Checking

Programming Languages

Scanning and parsing. Topics. Announcements Pick a partner by Monday Makeup lecture will be on Monday August 29th at 3pm

Introduction to Lex. General Description Input file Output file How matching is done Regular expressions Local names Using Lex

Software Vulnerabilities

Massachusetts Institute of Technology Department of Electrical Engineering and Computer Science

TitanMist: Your First Step to Reversing Nirvana TitanMist. mist.reversinglabs.com

csce4313 Programming Languages Scanner (pass/fail)

First Java Programs. V. Paúl Pauca. CSC 111D Fall, Department of Computer Science Wake Forest University. Introduction to Computer Science

Static vs. Dynamic. Lecture 10: Static Semantics Overview 1. Typical Semantic Errors: Java, C++ Typical Tasks of the Semantic Analyzer

03 - Lexical Analysis

Analyse et Conception Formelle. Lesson 5. Crash Course on Scala

A Tiny Guide to Programming in 32-bit x86 Assembly Language

Software Fingerprinting for Automated Malicious Code Analysis

Master of Sciences in Informatics Engineering Programming Paradigms 2005/2006. Final Examination. January 24 th, 2006

Where we are CS 4120 Introduction to Compilers Abstract Assembly Instruction selection mov e1 , e2 jmp e cmp e1 , e2 [jne je jgt ] l push e1 call e

Pemrograman Dasar. Basic Elements Of Java

Organization of DSLE part. Overview of DSLE. Model driven software engineering. Engineering. Tooling. Topics:

Context free grammars and predictive parsing

University of Twente. A simulation of the Java Virtual Machine using graph grammars

The C Programming Language course syllabus associate level

GENERIC and GIMPLE: A New Tree Representation for Entire Functions

Lex et Yacc, exemples introductifs

Getting Started with the Internet Communications Engine

by LindaMay Patterson PartnerWorld for Developers, AS/400 January 2000

Lexical analysis FORMAL LANGUAGES AND COMPILERS. Floriano Scioscia. Formal Languages and Compilers A.Y. 2015/2016

PL / SQL Basics. Chapter 3

Building a Multi-Threaded Web Server

Tutorial for Creating Resources in Java - Client

Syntaktická analýza. Ján Šturc. Zima 208

Programming Languages and Compilers

How To Write A Program In Anieme Frontend (For A Non-Programmable Language)

UIL Computer Science for Dummies by Jake Warren and works from Mr. Fleming

Stack Allocation. Run-Time Data Structures. Static Structures

Off-by-One exploitation tutorial

Flex/Bison Tutorial. Aaron Myles Landwehr CAPSL 2/17/2012

Compiler Design July 2004

Intermediate Code. Intermediate Code Generation

About the Tutorial. Audience. Prerequisites. Copyright & Disclaimer. Compiler Design

Integrating Formal Models into the Programming Languages Course

MULTIPLE CHOICE. Choose the one alternative that best completes the statement or answers the question.

If-Then-Else Problem (a motivating example for LR grammars)

The Cool Reference Manual

Programming Languages

Introduction. Figure 1 Schema of DarunGrim2

Computer Programming. Course Details An Introduction to Computational Tools. Prof. Mauro Gaspari:

Name: Class: Date: 9. The compiler ignores all comments they are there strictly for the convenience of anyone reading the program.

02 B The Java Virtual Machine

Fast JavaScript in V8. The V8 JavaScript Engine. ...well almost all boats. Never use with. Never use with part 2.

An Introduction to Assembly Programming with the ARM 32-bit Processor Family

Design Patterns in Parsing

Topics. Parts of a Java Program. Topics (2) CS 146. Introduction To Computers And Java Chapter Objectives To understand:

Moving from CS 61A Scheme to CS 61B Java

Return-oriented programming without returns

Applying Clang Static Analyzer to Linux Kernel

Comp151. Definitions & Declarations

Parsing Technology and its role in Legacy Modernization. A Metaware White Paper

language 1 (source) compiler language 2 (target) Figure 1: Compiling a program

University of Toronto Department of Electrical and Computer Engineering. Midterm Examination. CSC467 Compilers and Interpreters Fall Semester, 2005

Stack machines The MIPS assembly language A simple source language Stack-machine implementation of the simple language Readings:

JDK 1.5 Updates for Introduction to Java Programming with SUN ONE Studio 4

Guile Present. version 0.3.0, updated 21 September Andy Wingo

Advanced compiler construction. General course information. Teacher & assistant. Course goals. Evaluation. Grading scheme. Michel Schinz

I. INTRODUCTION. International Journal of Computer Science Trends and Technology (IJCST) Volume 3 Issue 2, Mar-Apr 2015

Transcription:

Compiler Compiler Tutorial CSA2010 Compiler Techniques Gordon Mangion

Introduction With so many Compilers around, do we need to write parsers/compilers in industry? FTP interface Translator from VB to Java EPS Reader NLP

Topics Prerequisites Compiler Architecture/Modules JavaCC Virtual Machines Semantic Analysis Code Generation and Execution Examples The assignment (SL Compiler)

Prerequisites Java Regular Expressions? + * Production rules and EBNF Semantics

Regular Expressions Repetitions + = 1 or more * = 0 or more? = 0 or 1 Alternative a b = a or b Examples a+ - a, aa, aaa b* -, b, bb c? -, c a b - a, b Ranges [a-z] [fls] [^cde] = a to z = f, l and s = not c,d,e - a,b,c,d,e,f,g,,y,z - f,l,s - a,b,f,g,,y,z

Compiler What is a compiler? Where to start from? Design / Architecture of a Compiler

Compiler Is essentially a complex function which maps a program in a source language onto a program in the target language. C o m p i l e r Source Code Lexical Analysis Syntax Analysis Semantic Analysis I-Code Optimiser Error Handler Target Code Symbol Table Code Execution Code Generator Optimiser Code Optimiser

Translation Source Code int Sqr( int x ) var int n = x; n = n * n; return n; push mov sub push push push lea mov mov rep stos mov mov mov imul mov mov pop pop pop mov pop ret Target Code ebp ebp,esp esp,0cch ebx esi edi edi,[ebp-0cch] ecx,33h eax,0cccccccch dword ptr es:[edi] eax,dword ptr [x] dword ptr [n],eax eax,dword ptr [n] eax,dword ptr [n] dword ptr [n],eax eax,dword ptr [n] edi esi ebx esp,ebp ebp

Translation Source Code int Sqr( int x ) var int n = x; n = n * n; return n; Compiler All possible translations of the source program

Translation Source Code Target Code p u s h ebp mov ebp,esp s u b e s p, 0 C C h p u s h ebx p u s h esi p u s h edi l e a edi, [ e b p - 0CCh] mov ecx,33h mov e a x, 0 C C C C C C C C h r e p stos dword p t r es:[e d i ] int Sqr( int x ) var int n = x; n = n * n; return n; mov mov mov imul mov mov eax,dword ptr [x] dword ptr [n],eax eax,dword ptr [n] eax,dword ptr [n] dword ptr [n],eax eax,dword ptr [n] p o p p o p p o p mov p o p ret edi esi ebx esp,ebp ebp

Production Rules Context Free Grammars A B c D BNF A ::= B c D EBNF A ::= B* c? D+

The Language game Source Language Target Language Implementation Language

Tombstone Diagram Source Target Language Language Implementation Language

Source Language Tokens Intermediate Code Compiler Architecture Error Handler Source Code Lexical Analysis Syntax Analysis Semantic Analysis Intermediate Code I-Code Optimiser Intermediate Code Symbol Table Code Execution Code Generator Optimiser Code Optimiser

Simplified Compiler Architecture Source Code Source Language Lexical Analysis Tokens Syntax Analysis Semantic Analysis Intermediate Code Symbol Table Intermediate Code Code Generator Target Code

Lexical Analysis Tokenises the source file Removes whitespace Tokens Keywords Source Code function Sqr( x : int ) : int let n : int = x; n <- n * n; return n; Function (Keyword) Sqr (Identifier) ( (Lparen) X (Identifier) : (Colon) Int (Keyword) ) (Rparen) : (Colon) Int (Keyword) (Lbrace) Let (Keyword) N (Identifier) : (Colon) Int (Keyword) = (Eq) X (Identifier) ; (Semicolon)

Syntax Analysis (Parser) Checks that the source file conforms to the language grammar E.g. FunctionDecl ::= function identifier ( Source Code Source Code function Sqr( x : int ) function 1.5( x : int ) Creates intermediate code ParseTree SimpleExpr 2 + 5

Semantic Analysis Checks that the meaning behind the syntax makes sense, according to the type-system E.g. var int x = 3; x:int, 3:int E.g. var int x = 3.2; x:int, 3.2:Real

Code Generation / Execution Traverses the Intermediate Code representation and generates or executes the code 2 + 5 PlusNode.Generate() leftchild.generate() ; rightchild.generate(); EmitCode(Add); IntLiteralNode.Generate() EmitCode ( Push, Integer.parseInt(this.getValue()) );

Symbol Table Important Data Structure Keeps information about every identifier in the source Variables functions Labels Keeps the scope information Entry Properties Name Type Value Scope

Symbol Table A data structure that maps an Identifier s name onto a structure that contains the identifier s information Name ( Name, Type, Value, Scope )

Symbol Table Easiest way is to make use of a hash-table / hash-map Create a new Hash-map for each new scope

Java Interfaces Interface is a contract If a Class implements interface Honours the contract Implements the methods of the interface Interface type variable can hold instance of a class that implements that interface

Java Interfaces public interface IAdder int add(int n, int m); public interface IMinus int subtract(int n, int m);

Java Interfaces public interface IAdder int add(int n, int m); public interface IMinus int subtract(int n, int m); public class SimpleMath implements IAdder, IMinus public int add(int n, int m) public int subtract(int n, int m)

Java Interfaces public interface IAdder int add(int n, int m); public interface IMinus int subtract(int n, int m); public class SimpleMath implements IAdder, IMinus public int add(int n, int m) public static void main( ) IAdder a = new SimpleMath(); IMinus s = new SimpleMath(); public int subtract(int n, int m) a.add(1,2); s.subtract(4,2);

Java Interfaces public interface ICalculator int Calculate(int n, int m);

Java Interfaces public class Mul implements ICalculator public int Calculate(int n, int m) n * m public class Div implements ICalculator public int Calculate(int n, int m) n / m public interface ICalculator int Calculate(int n, int m);

Java Interfaces public class Mul implements ICalculator public int Calculate(int n, int m) n * m public class Div implements ICalculator public int Calculate(int n, int m) n / m public interface ICalculator int Calculate(int n, int m); public static void main( ) ICalculator c1 = new Mul(); ICalculator c2 = new Div(); c1.calculate(4,2); c2.calculate(4,2);

Simplified Compiler Architecture Source Code Source Language Lexical Analysis Tokens Front-End Syntax Analysis Semantic Analysis Intermediate Code Intermediate Code Symbol Table Back-End Code Generator Target Code

Visitor Interface Compiler Interface Visitor Interface Compiler Architecture Compiler Implementation Source Code Parser (Syntax Analysis) Lexical Analysis Parse Tree Symbol Table Call Visitor Type-Checker (Semantic Analysis) Call Visitor Code Execution

Program Generators? Source-to-Executable Compiler Reverse Polish Notation 2 + 3-4 2 3 + 4 - Source-to-Source Preprocessors

Javacc A program that creates parsers The source code(input) is a definition file Grammar definition Inline Java code The target(output) is java-based parser Recognizer?

Javacc langdef.jj Javacc *.java *.java *.java *.java

JJTree Preprocessor to Javacc Creates.jj files from.jjt files From a recognizer to a proper parser Produces Parse Tree building actions

JJTree langdef.jjt JJTree langdef.jj Javacc *.java *.java *.java *.java

JJTree langdef.jjt JJTree langdef.jj J J T T O O L Javacc *.java *.java *.java *.java

Installing Javacc https://javacc.dev.java.net/ Javacc.zip / Javacc.tar.gz Eclipse plugin Preferences->Install/Update->Add http://eclipse-javacc.sourceforge.net/ Help->New Software Newer versions Eclipse Marketplace

.jjt Grammar Files Four (4) sections Options Parser Tokens Production Rules

.jjt Options options BUILD_NODE_FILES=false; STATIC=false; MULTI=true;

.jjt Parser block PARSER_BEGIN(parser_name)... public class parser_name PARSER_END(parser_name)

.jjt Tokens Lexeme to ignore SKIP : \t \n \r <"//" (~["\n","\r"])* ("\n" "\r" "\r\n")>

.jjt Tokens Tokens that are to be returned TOKEN : <PLUS: + > <TRUE: "true" > <FALSE: "false" > <LETTER: (["A"-"Z"] ["a"-"z"]) > <STRING_LITERAL: "\"" (~["\"","\r","\n"])* "\"" > <#DIGIT: [ 0-9 ]>

.jjt Production Rules Assume the following: Header Script <STRING_LITERAL> or Header ::= Script <STRING_LITERAL>

.jjt Production Rules Assume the following: Header ::= Script <STRING_LITERAL> void Header(): <SCRIPT> <STRING_LITERAL>

.jjt Production Rules Header ::= Script <STRING_LITERAL> void Header(): int n = 0; n++; <SCRIPT> <STRING_LITERAL>

.jjt Production Rules Token matching - Actions void Header(): int n = 0; n++; <SCRIPT> n = 1; <STRING_LITERAL> n++;

.jjt Production Rules Calling Non-Terminals void Integer(): void Header(): <SCRIPT> Integer()

.jjt Production Rules Getting Token value void Number() Token t; int n = 0; t=<digit> n = integer.parseint(t.image);

Lookahead Consider the following java statements public int name; public int name[]; public int name()

Building the AST (Abstract Syntax Tree) options STATIC=false; MULTI=true; BUILD_NODE_FILES=true; NODE_USES_PARSER=false; NODE_PREFIX= ; // default AST

Building the AST SimpleNode Start() : Expression() ; <EOF> // Special Token return jjtthis;

Parsing PARSER_BEGIN(MyParser)... MyParser parser = new MyParser(System.in); try SimpleNode n = parser.start(); System.out.println( Parsed!"); catch (Exception e) System.out.println("Oops!"); System.out.println(e.getMessage());... PARSER_END(MyParser)

Example Digit ::= [ 0-9 ] Number ::= Digit+ Plus ::= + Minus ::= - Op ::= Plus Minus Expression ::= Number Op Number

Example TOKEN: < NUMBER: <DIGIT>+ > < Digit: [ 0-9 ] > < PLUS: + > < MINUS: - > Digit ::= [ 0-9 ] Number ::= Digit+ Plus ::= + Minus ::= -

Example void Op() : < PLUS > < MINUS > Op ::= Plus Minus void Expression(): < Number > (Op() < Number >)* Expression ::= Number Op Number

Example PARSER_BEGIN(MyParser)... MyParser parser = new MyParser(System.in); try parser.expression(); System.out.println( Parsed!"); catch (Exception e) System.out.println("Oops!"); System.out.println(e.getMessage());... PARSER_END(MyParser)

Generated Sources

Example Evaluating Token Op() : Token t; (t = < PLUS > t = < MINUS >) return t;

Example int Expression(): Token t, op; int n; t = < NUMBER > n = Integer.parseInt( t.image ); ( op=op() t = < NUMBER > if(op.image.equals("+")) n += Integer.parseInt( t.image ); else n -= Integer.parseInt( t.image ); )* return n;

Example PARSER_BEGIN(MyParser) public class MyParser... MyParser parser = new MyParser(System.in); try int n = parser.expression();... PARSER_END(MyParser)

Example - Building the AST options STATIC=false; MULTI=true; BUILD_NODE_FILES=true; NODE_USES_PARSER=false; NODE_PREFIX= AST ;

Generated Code

Example void Op() : < PLUS > < MINUS > SimpleNode Expression(): < Number > (Op() < Number >)* return jjtthis; Op ::= Plus Minus Expression ::= Number Op Number

Example PARSER_BEGIN(MyParser) public class MyParser... MyParser parser = new MyParser(System.in); try SimpleNode rootnode = parser.expression();... PARSER_END(MyParser)

Example Grammar 2 Digit ::= [ 0-9 ] Number ::= Digit+ Factor ::= Expression Number Term ::= Factor [ * / Factor ] Expression ::= Term + - Term Start ::= Expression

The Visitor Design Pattern The Problem + 2 * A 7 Number of operations to be performed on each node Options Implement each operation inside each node Make use of visitor pattern

The Visitor Design Pattern Consider one Node Printing Operation Plus PrintVisitor void PrettyPrint( Plus ) We can implement the operation in a separate class e.g. PrintVisitor This can be done for all type of nodes

The Visitor Design Pattern Modification on node Plus void Print( Visitor p_visitor) p_visitor.prettyprint( this ); Client Caller PrintVisitor pr = new PrintVisitor(); Plus plus plus.print(pr); PrintVisitor void PrettyPrint( Plus )

The Visitor Design Pattern Finally Plus void Accept( IVisitor p_visitor) p_visitor.visit( this ); Interface IVisitor void Visit( Plus ); Caller PrintVisitor pr = new PrintVisitor(); Plus plus plus.accept(pr); PrintVisitor implements IVisitor void Visit( Plus )

The Visitor Design Pattern Benefits Plus void Accept( IVisitor p_visitor) p_visitor.visit( this ); Interface IVisitor void Visit( Plus ); void Visit( Times ); PrintVisitor implements IVisitor void Visit( Plus ) void Visit( Times ) TypeCheckVisitor implements IVisitor void Visit( Plus ) void Visit( Times ) EvaluationVisitor implements IVisitor void Visit( Plus ) void Visit( Times )

Visitor Interface Compiler Interface Visitor Interface Compiler Architecture Compiler Implementation Source Code Parser (Syntax Analysis) Lexical Analysis Parse Tree Symbol Table Call Visitor Type-Checker (Semantic Analysis) Call Visitor Code Execution

JJTree and the Visitor Pattern Options VISITOR=true;

Visitor interface public interface MyParserVisitor public Object visit(simplenode node, Object data); public Object visit(astop node, Object data); public Object visit(astexpression node, Object data);

Visitor - Node modification Public class ASTExpression extends SimpleNode public ASTExpression(int id) super(id); public ASTExpression(MyParser p, int id) super(p, id); /** Accept the visitor. **/ public Object jjtaccept(myparservisitor visitor, Object data) return visitor.visit(this, data);

JJTree and the Visitor Pattern Options VISITOR=true; VISITOR_DATA_TYPE= SymbolTable ; VISITOR_RETURN_TYPE= Object ;

Visitor - return type We need a return-type generic enough to accommodate the results returned by all the visitor implementations By default jjt uses the Object class Can easily be used however class-casts instanceof A generic container can be designed to hold the results

Visitor - return type Types Create an enumeration containing the types of the language s type-system. This should always be created enum DataType None (/ Unknown), Error, Skip (/ Command), Bool, Int, Function,

Visitor - return type Result class Class Result DataType type; Object value; Getter & Setter Conversion

Visitor - return type We can make use of: Object Most generic return type Have to cast to proper instance DataType When the Type of the node suffices Result class When we need to return some data

SymbolTable Entry String Name DataType Type Value? Name Entry

SymbolTable Entry String Name DataType Type Int ScopeLevel Var / Param DataType ReturnType Int VarCount Int ParamCount (Entry Containter)

Type-Checking (Semantic Analysis) SemanticAnalyser (implements Visitor) Consider BooleanLiteral() public DataType visit( ASTBooleanLiteral node, SymbolTable data) return DataType.Bool;

Type-Checking (Semantic Analysis) Consider Identifier() public Object visit( ASTIdentifier node, SymbolTable data ) // Get name from the node String name = (String)node.jjtGetValue(); Consult symboltable, check if name exist if yes return its DataType println( Error ASTIdentifier : " + name); return DataType.Error;

Type-Checking (Semantic Analysis) Consider Assignment(): Identifier() <ASSIGN> Expression() Ident = Expr SimpleExpr 3 + 2

Type-Checking (Semantic Analysis) Consider Assignment(): Identifier() <ASSIGN> Expression() public Object visit(astassignment node, SymbolTable data ) // Check identifier DataType identtype = node.jjtgetchild(0).visit(this, data); if(identtype == DataType.Error) return DataType.Error;

Type-Checking (Semantic Analysis) Consider Assignment(): Identifier() <ASSIGN> Expression() // Check expresion DataType exprtype = node.jjtgetchild(1).visit(this, data); if(identtype!= exprtype) println( Error ASTAssignment ); return DataType.Error; return DataType.Skip;

Type-Checking (Semantic Analysis) Note the difference in the use of identifiers when they are: L-value [ a = 2 + 3 ] R-value [ x = a + 4 ]

Type-Checking (Semantic Analysis) Consider the following decision rule IfStatement ::= if ( Expression ) if( 3 + 2 ) Expression if Statement Block Statement Block

Type-Checking (Semantic Analysis) Use node.jjtgetnumchildren() to get the number of children the node has. This determines the shape of the tree examples are If Statement Variable Declaration Initialiser (var int n = 0;) Function Delaration Statement Block

Type-Checking (Semantic Analysis) Implement the call to the visitor: Public class MyParser... main... Try SimpleNode root = parser.expression(); MyParserVisitor visitor = new TypeChecker(); Result result = root.jjtaccept(visitor, null );... System.out.println("DataType is " + result.gettype().tostring());

Interpreter Code Execution In a similar way to Semantic Analysis, we can make use of the visitor pattern This time, we return values as well rather than type-information only We have to take special care about the difference in the semantics of the languages involved

Code Generation Once again we make use of the visitor pattern In this stage we traverse the parse-tree and emit target language code in our case S-Machine instructions In particular, we traverse nodes and emit code patterns

SymbolTable Entries require an Offset variable For data related nodes, Offset is the actual offset in the Stack. For flow control nodes, Offset holds the location in the Code Area

Code Generation Since we are emitting S-Machine instructions, it is wise to create an enum of the instructions public enum SMInstruction NOP, LDC, LD, STORE, DUP,

Code Generation At the end of the whole process we are writing a binary file which is the compiled program. It is a good idea to create a buffer and perhaps a class that takes care of it When the process finished, the buffer is then written to disk

CodeBuilder class CodeBuilder Byte[] codebuffer Int GetCodePosition() void AddInstruction(SMInstruction inst) void AddInstruction(SMInstruction inst, int nscope, int narg) void WriteCode(String p_strpath)

CodeGenerator Class CodeGenerator Implements Visitor CodeGenerator(CodeBuilder cb) Int GetCodeOffset() Void Emit( SMInstruction inst, int nscope, int narg) Void Emit( SMInstruction inst, int narg) Void Emit( SMInstruction inst )

CodeGenerator Endianess CodeBuffer[Offset+2] = (narg & 0xFF00)>>8 CodeBuffer[Offset+3] = (narg & 0xFF)

CodeGenerator Consider Literal public Object visit( ASTIntegerLiteral node, SymbolTable data) // LDC n Emit( SMInstruction.LDC, 0, (Integer)node.jjtGetValue() ); return SLType.Skip;

CodeGenerator Consider Identifier public DataType visit( ASTIdentifier node, SymbolTable data) //Get name from node //Get Entry from symboltable //If Param //Else if Var Emit( SMInstruction.LD, entry.scope, entry.offset ); return DataType.Skip;

CodeGenerator Consider Assignment public DataType visit( ASTAssignment node, SymbolTable data ) name = get name from node 0 entry = data.get(name); node.jjtgetchild(1).jjtaccept(this, data); Emit( SMInstruction.STORE, entry.scope, entry.offset); return DataType.Skip;

CodeGenerator Consider While Can you identify a potential problem? Location_of_Condition: 00 Code for Condition 01 JZ Out_Of_While 02 Code for While_Block 03 JMP Location_of_Condition Out_Of_While: 04

CodeGenerator Consider While public Object visit(astwhilestatement node, SymbolTable data) int addrcond = GetCodeOffset(); node.jjtgetchild(0).jjtaccept(this, data); int addrjump = GetCodeOffset(); Emit(SMInstruction.JZ, 0, 0); node.jjtgetchild(1).jjtaccept(this, data); Emit(SMInstruction.JMP, 0, addrcond); int addrend = m_codebuilder.getcodepos(); BackPatch(addrJump, addrend); return SLType.Skip;

CodeGenerator BackPatch( address of instruction, new address); Modifies the address argument of an instruction

CodeGenerator Consider While public Object visit(astwhilestatement node, SymbolTable data) int addrcond = GetCodeOffset(); node.jjtgetchild(0).jjtaccept(this, data); int addrjump = GetCodeOffset(); Emit(SMInstruction.JZ, 0, 0); node.jjtgetchild(1).jjtaccept(this, data); Emit(SMInstruction.JMP, 0, addrcond); int addrend = m_codebuilder.getcodepos(); BackPatch(addrJump, addrend); return SLType.Skip;

CodeGenerator Consider FunctionDecl public DataType visit(astfunctiondecl node, SymbolTable data) Get Entry from symboltable for node 0 Set symboltable Scope to that of entry; entry.offset = GetCodeOffset(); Emit(SMInstruction.ENTER, 0, entry.varnum); if(node.jjtgetnumchildren() == 4) node.jjtgetchild(3).jjtaccept(this, data); else node.jjtgetchild(2).jjtaccept(this, data); restore symboltable scope return DataType.Skip;

CodeGenerator Consider Program Function Declarations are generated first Start code with a jmp instruction Enter a new scope

Questions? The End