Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Write the subprogram for_statement() wich is a part of a recursive descent parse

ID: 3639100 • Letter: W

Question

Write the subprogram for_statement() wich is a part of a recursive descent parser
for java, which parses this non-terminal. You do not have to write other subprograms which this subprograms uses - just assume they exist.

Assume that there exists a lexical analyser lex() callable by for_statement() for fetching the next token. The global variable nextToken keeps the value of this token and for the subprogram for_statement() the following tokens matter: FOR, LEFT_PARENT,RIGHT_PARENT,SEMICOL

BNF : <for_statement> ::=for(<var_decl>:<expr>;)<statement>

note: after executions of each subprogram the newest token is in the variable nextToken, also assume that there exists an error() function which you could use if the current token is not equal to the one expected.

Explanation / Answer

import java.io.*; /* This program illustrates recursive descent parsing using a pure procedural approach. The grammar: statement = { expression ";" } "." expression = term { ( "+" | "-" ) term } term = factor { ( "*" | "/" ) factor } factor = number | "(" expression ")" */ public class Parser { private Scanner scanner; public Parser(Scanner scanner) { this.scanner = scanner; } // Parser public void run ( ) { scanner.getToken( ); statement( ); } // run private void statement ( ) { // statement = { expression ";" } "." while(scanner.token != Token.period) { int value = expression( ); System.out.println("=> " + value); scanner.getToken( ); // flush ";" } // while } // statement private int expression ( ) { // expression = term { ( "+" | "-" ) term } int left = term( ); while (scanner.token == Token.plusop || scanner.token == Token.minusop) { int saveToken = scanner.token; scanner.getToken( ); switch (saveToken) { case Token.plusop: left += term( ); break; case Token.minusop: left -= term( ); break; } // switch } // while return left; } // expression private int term ( ) { // term = factor { ( "*" | "/" ) factor } int left = factor( ); while (scanner.token == Token.timesop || scanner.token == Token.divideop) { int saveToken = scanner.token; scanner.getToken( ); switch (saveToken) { case Token.timesop: left *= factor( ); break; case Token.divideop: left /= factor( ); break; } // switch } // while return left; } // term private int factor ( ) { // factor = number | "(" expression ")" int value = 0; switch (scanner.token) { case Token.number: value = scanner.number( ); scanner.getToken( ); // flush number break; case Token.lparen: scanner.getToken( ); value = expression( ); if (scanner.token != Token.rparen) scanner.error("Missing ')'"); scanner.getToken( ); // flush ")" break; default: scanner.error("Expecting number or ("); break; } // switch return value; } // factor } // class Parser