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 parserfor 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
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.