CS 321 Programming Languages and Compilers VI-a. Recursive Descent Parsing
Parsing 2 Assignment Statement Grammar Consider the grammar Assignment Variable = Expression Expression Expression + Term | Expression – Term | Term | - Term Term Term * Factor | Term / Factor | Factor Factor ( Expression ) | Variable
Parsing 3 After 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
Parsing 4 Beginning of Java Program import 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); }
Parsing 5 Assignment( ) static public void Assignment() throws IOException { System.out.println("Assignment -> Variable = Expression"); Variable(); if (token == EQUAL) token=tokens.nextToken(); else Error(); Expression(); }
Parsing 6 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"); }
Parsing 7 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"); }
Parsing 8 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(); }
Parsing 9 static public void Variable () throws IOException { if (token == tokens.TT_WORD) { token=tokens.nextToken(); } else Error(); }