Answered step by step
Verified Expert Solution
Question
1 Approved Answer
Please modify only the file prog.cpp by adding the methods you need for your parser. Please use the following grammar: prog - > begin stmt
Please
modify only the file prog.cpp by adding the methods you need for your parser.
Please use the following grammar:
prog begin stmtlist end
stmtlist stmt ; stmtlist
stmt
stmt ;
stmt var expr
var A B C
expr var expr
var expr
var
Implement a recursive descent parser similar to the ones we covered in class.
Note that:
we have two keywords: begin and end
we have only three valid identifier: A B and C
the grammar supports three operators: and
a semicolon ; is a stmt separator within stmtlist
The lexical analyzer in lexan.cpp has already been modified to recognize the tokens listed
above. You may want to compile and run testlexan.cpp with lexan.cpp to verify that this
is the case. Use the input file tptxt and create others that you find necessary. It does
not mean that any token that the lexical analyzer recognizes is a valid token for the prog
grammar above. It is the parser's job to flag invalid input due to bad tokens or invalid
statements.
Here are three examples of valid input files they appear in parser.zip and they are tp
txt tptxt and tptxt:
begin
A A
end
begin
A A;
B C
end
begin
B A C;
A B;
C A B C A;
end
The results appear in the file outtxt outtxt and outtxt
Remember, if we can generate a parse tree for an input file, your parser should accept the
input. Anything else should be flagged as an error.
Please see the attached tptxt files that can be used as input, and the outtxt files that
contain the output produced.
Your code should not be limited to handle only these three examples.
Prog.cpp:
prog begin stmtlist end
stmtlist stmt ; stmtlist
stmt
stmt;
stmt var expr
var A B C
expr var expr
var expr
var
#include
#include
#include
#include "token.h
#include "functions.h
using namespace std;
ifstream ifs; input file stream used by lexan
SymTab symtab; global symbol table
Token token; global token
int lookahead ; no look ahead token yet
int dbg ; debut is ON
int main
ifs getifs; open an input file stream w the program
initkws; initialize keywords in the symtab
match lookahead ; get the first input token
prog;
return ;
your methods...
utility methods
void emit int t
switch t
case : case : case :
cout char t ;
break;
case ;:
cout ;
;
break;
case
:
cout
;
break;
case ID:
case KW:
case UID:
cout symtab.tokstr token.tokvalue;
break;
default:
cout token t tokvalue
token.tokvalue;
break;
void error int t int expt, const string &str
cerr
unexpected token ;
if lookahead DONE
cerr "EOF";
else
cerr token.tokstr;
cerr of type lookahead;
switch expt
case : default value; nothing to do
break;
case ID:
cout while looking for an ID;
break;
case KW:
cout while looking for KW str ;
break;
default:
cout while looking for char expt ;
break;
cerr
syntax error.
;
exit;
void match int t
if lookahead t
token lexan; get next token
lookahead token.toktype; lookahed contains the tok type
else
error t ;
The lexical analyzer in lexan.cpp has already been modified to recognize the tokens listed above. You may want to compile and run testlexan.cpp with lexan.cpp to verify that this is the case. Use the input file tptxt and create others that you find necessary. It does not mean that any token that the lexical analyzer recognizes is a valid token for the prog grammar above. It is the parser's job to flag invalid input due to bad tokens or invalid statements.
Here are three examples of valid input files they appear in parser.zip and they are tp
txt tptxt and tptxt:
begin
A A
end
begin
A A;
B C
end
begin
B A C;
A B;
C A B C A;
end
The results appear in the file outtxt outtxt and outtxt
Remember, if we can generate a parse tree for an input file, your parser should accept the
input. Anything else should be flagged as an error.
Please see the attached tptxt files that can be used as input, and the outtxt files that
contain the output produced.
Your code should not be limited to handle only these three examples.
Notes to Source Code:
testlexan.cpp calls lexan.cpp and tests whether lexan.cpp properly emits tokens
prog.cpp calls lexan.cpp to get next token from input
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started