cs 321 programming languages and compilers vi-a. recursive descent parsing
TRANSCRIPT
CS 321Programming Languages and
Compilers
CS 321Programming 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
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
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);
}
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();
}
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");}
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");}
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();
}
}
ParsingParsingParsingParsing99
static public void Variable () throws IOException {
if (token == tokens.TT_WORD) {
token=tokens.nextToken();
}
else Error();
}
}