3/9/15
CS 280
Programming Language
Concepts
Design Notes
Programming Assignment 3
1
3/9/15
High Level Questions
• Do I understand the requirements?
• Do I understand how to meet the
requirements?
Observations
• You will be given an implementation of a
lexical analyzer: a header file, a getToken()
function, and a pushback token function
• The lexical analyzer will keep track of line
numbers for you
• The key to the assignment is deciding how to
represent the data and how to structure the
functions
2
3/9/15
Recursive Descent Parsing
• Production rules will need to be implemented
in functions
• Functions for production rules will call
getToken() or other functions for other rules
• Functions will return a parse tree – so you
need to come up with some kind of class
definition for parse tree
Grammar Rules
Program ::= StmtList
StmtList ::= Stmt | Stmt StmtList
Stmt ::=
PRINT Expr SC | SET ID Expr SC
Expr ::=
Expr PLUS Term | Expr MINUS Term | Term
Term ::=
Term STAR Primary | Term SLASH Primary | Primary
Primary ::= ID | INT | STRING
• You need a function per rule
• The functions take a pointer to the input stream to read
• The functions return a pointer to a parse tree
3
3/9/15
Getting Started
• Decide how you will represent the result of a parse
• Declare all your functions, then define them
• You will probably need a global error counter to
keep track of the number of errors
• Think about the idea of an error strategy: if I find an
error, what should I do besides just printing out an
error message?
Parse Tree
• Common members in a PTree base class
– type
– left and right child
• Common methods in base class
– getType(), getValue(), traversals
• Probably want to think about a class
inheritance hierarchy. Several classes that
are subclasses of Ptree
–
–
–
–
Class for “list of statements”
Class for “print” and “set”
Classes for different expressions
Class for identifier, integer, string
4
3/9/15
If I were you I would reuse this main
int
main( int argc, char *argv[] )
{
istream *br;
ifstream infile;
// check args and open the file
if( argc == 1 )
br = &cin;
else if( argc != 2 ) {
return 1; // print an error msg
} else {
infile.open(argv[1]);
if( infile.is_open() )
br = &infile;
else {
cout << argv[1] << " can't be opened" << endl;
return 1;
}
}
// pass br as the first argument to Program()
5
© Copyright 2025