cs 321 programming languages and compilers vi-a. recursive descent parsing

9
CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

Upload: megan-greer

Post on 13-Dec-2015

215 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

CS 321Programming Languages and

Compilers

CS 321Programming Languages and

Compilers

VI-a. Recursive Descent Parsing

Page 2: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing22

Assignment Statement GrammarAssignment Statement Grammar

Consider the grammar

Assignment Variable = Expression

Expression Expression + Term | Expression – Term | Term | - Term

Term Term * Factor | Term / Factor | Factor

Factor ( Expression ) | Variable

Page 3: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing33

After Elimination of Left RecursionAfter Elimination of Left Recursion

Assignment Variable = Expression

Expression Term Expression0 | - Term Expression0

Expression0 + Term Expression0 | – Term Expression0 | Term Factor Term0

Term0 * Factor Term0 | / Factor Term0 | Factor ( Expression ) | Variable

Page 4: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing44

Beginning of Java ProgramBeginning of Java Programimport java.io.*;

public class Translate2 {static int token = 0;static int temp = 0;static final int LEFTPAR=40;static final int RIGHTPAR=41;static final int STAR=42;static final int PLUS=43;static final int MINUS=45;static final int SLASH=47;static final int EQUAL=61;static StreamTokenizer tokens; public static void main(String argv[]) throws IOException { FileInputStream stream = new FileInputStream("input.data"); InputStreamReader reader = new InputStreamReader(stream); tokens = new StreamTokenizer(reader);

tokens.ordinaryChar( '/');tokens.ordinaryChar( '-');

token=tokens.nextToken();Assignment();

stream.close(); }

static public void Error () {System.out.println("*** Syntax Error ***");System.exit(0);

}

Page 5: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing55

Assignment( )Assignment( )

static public void Assignment() throws IOException {

System.out.println("Assignment -> Variable = Expression");

Variable();

if (token == EQUAL)

token=tokens.nextToken();

else Error();

Expression();

}

Page 6: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing66

Expression ( ) & Expression0 ( )Expression ( ) & Expression0 ( )static public void Expression() throws IOException {

if (token == MINUS) {System.out.println(" Expression -> - Term Expression0");token=tokens.nextToken();Term();}

else {System.out.println(" Expression -> Term Expression0");Term();}

Expression0 ();}static public void Expression0() throws IOException {

if (token == PLUS ) {System.out.println("Expression0 -> + Term Expression0 ");token=tokens.nextToken();Term();Expression0();

}else if (token == MINUS) {

System.out.println("Expression0 -> - Term Expression0");token=tokens.nextToken();Term();Expression0();}

else System.out.println("Expression0 -> epsilon");}

Page 7: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing77

Term ( ) & Term0 ( )Term ( ) & Term0 ( )

static public void Term() throws IOException {System.out.println("Term -> Factor Term0");Factor();Term0();

}static public void Term0() throws IOException {

if (token == STAR) {System.out.println("Term0 -> * Factor Term0 ");token=tokens.nextToken();Factor();Term0();

}else if (token == SLASH) {

System.out.println("Term0 -> / Factor Term0 ");token=tokens.nextToken();Factor();Term0();}

else System.out.println("Term0 -> epsilon");}

Page 8: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing88

Factor ( )Factor ( )

static public void Factor() throws IOException {if (token == tokens.TT_NUMBER) {

System.out.println("Factor -> Constant");token=tokens.nextToken();

}

else if (token == LEFTPAR) { System.out.println("Factor -> ( Expression )");

token=tokens.nextToken();Expression();if (token == RIGHTPAR)

token=tokens.nextToken();else Error();

} else {

System.out.println("Factor -> Variable");Variable();

}

}

Page 9: CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing

ParsingParsingParsingParsing99

static public void Variable () throws IOException {

if (token == tokens.TT_WORD) {

token=tokens.nextToken();

}

else Error();

}

}