Starting from:
$35

$29

Programming Assignment 4 Solution

Now that we have a parser for our grammar, we will add an interpreter for the language.




In order to build the interpreter, we must build an evaluation function for each operation in the language. The evaluation functions are responsible for performing all type and value checks that were outlined in assignment 3. Any failures of these checks result in a RUNTIME ERROR.




All requirements for error detection and error message generation from Assignment 3 are included in assignment 4.




As a reminder from assignment 3, here is the grammar and the semantic rules of the language:




Prog :=
Slist






Slist := Ssep { Slist }
|
Stmt Ssep { Slist }
Ssep :=
NL |
SC




Stmt :=
IfStmt | PrintStmt | SetStmt | LoopStmt
IfStmt := IF
Expr BEGIN
Slist END
PrintStmt :=
PRINT Expr




SetStmt
:= SET IDENT Expr


LoopStmt := LOOP Expr BEGIN Slist END
Expr :=
Prod
{ (PLUS | MINUS) Prod }
Prod :=
Primary { (STAR
|
SLASH) Primary }
Primary
:= IDENT | ICONST
| SCONST | LPAREN Expr RPAREN



Below is the list from assignment 3. Note that several of the items in the list are shown in boldface. These are items that must be checked at runtime.




 
The language contains two types: integer and string.




 
All operators are left associative.




 
An IfStmt evaluates the Expr. ​The expr must evaluate to an integer​. If the integer is nonzero, then the Stmt is executed.




 
A PrintStmt evaluates the Expr and prints its value.




 
A SetExpr evaluates Expr and saves its value in memory associated with the IDENT. If the IDENT does not exist, it is created. If the IDENT already exists, its value is replaced.

 
The type of an IDENT is the type of the value assigned to it.




 
The PLUS and MINUS operators in Expr represent addition and subtraction.




 
The STAR and SLASH operators in Prod represents multiplication and division.




 
It is an error if a variable is used before a value is assigned to it​.

 
Addition is defined between two integers (the result being the sum) or two strings (the result being the concatenation).

 
Subtraction is defined between two integers (the result being the difference).




 
Multiplication is defined between two integers (the result being the product) or for an integer and a string (the result being the string repeated integer times).




 
Division is defined between two integers




 
Performing an operation with incorrect types or type combinations is an error.




 
Multiplying a string by a negative integer is an error.




 
An IF or LOOP statement whose Expr is not integer typed is an error.










For Programming Assignment 4, you must implement a mechanism for evaluating each of the parse tree nodes that you created for Assignment 3.




The evaluation function for each parse tree node must evaluate any arguments, check for any errors, and generate either a Value representing the evaluation, or an error.




You must create a main for your interpreter, with the same requirements as the main from assignment 3.




The result of an unsuccessful parse is a set of error messages printed by the parse functions. If the parse fails, the program should stop after the parse function returns. The requirements for parse error messages are the same for assignment 3.




On a successful parse, the tree should be evaluated using some evaluation function that you write.




In the event that a runtime error occurs, your program should throw an exception. This exception should be caught in the main routine and should be printed after the message RUNTIME ERROR.




Here are the error messages that should be generated as RUNTIME ERROR conditions in the event of a failure. The messages should be self-explanatory; where they are not, some extra explanation is included




Type mismatch for arguments of +




Type mismatch for arguments of -




Type mismatch for arguments of *

Repetition count less than 0 ​generated if you multiply a string by a negative integer




Invalid type for arguments of /




Divide by zero error

Conditional is not an integer ​used in if statement

Loop conditional is not an integer ​used in loop statement

Symbol INDENTIFIER not defined ​where IDENTIFIER is the variable used but not defined

More products