编译器原理parser代写:cop5556 Assignment 2

Assignment 2

Due:  13 February at 11:59pm

 

Implement a recursive descent parser for the following context-free grammar:

 

program ::=  IDENT block

program ::=  IDENT param_dec ( , param_dec )*   block

paramDec ::= ( KW_URL | KW_FILE | KW_INTEGER | KW_BOOLEAN)   IDENT

block ::= { ( dec | statement) * }

dec ::= (  KW_INTEGER | KW_BOOLEAN | KW_IMAGE | KW_FRAME)    IDENT

statement ::=   OP_SLEEP expression ; | whileStatement | ifStatement | chain ; | assign ;

assign ::= IDENT ASSIGN expression

chain ::=  chainElem arrowOp chainElem ( arrowOp  chainElem)*

whileStatement ::= KW_WHILE ( expression ) block

ifStatement ::= KW_IF ( expression ) block

arrowOp ∷= ARROW   |   BARARROW

chainElem ::= IDENT | filterOp arg | frameOp arg | imageOp arg

filterOp ::= OP_BLUR |OP_GRAY | OP_CONVOLVE

frameOp ::= KW_SHOW | KW_HIDE | KW_MOVE | KW_XLOC |KW_YLOC

imageOp ::= OP_WIDTH |OP_HEIGHT | KW_SCALE

arg ::= ε | ( expression (   ,expression)* )

expression ∷= term ( relOp term)*

term ∷= elem ( weakOp  elem)*

elem ∷= factor ( strongOp factor)*

factor ∷= IDENT | INT_LIT | KW_TRUE | KW_FALSE

| KW_SCREENWIDTH | KW_SCREENHEIGHT | ( expression )

relOp ∷=  LT | LE | GT | GE | EQUAL | NOTEQUAL

weakOp  ∷= PLUS | MINUS | OR

strongOp ∷= TIMES | DIV | AND | MOD

 

 

 

  • Use the provided Parser.java and ParserTest.java as a starting point. Your Scanner.java from assignment 1 (with any errors corrected) will also be needed.
  • The parser should simply determine whether the given sentence is legal or not. If not, the parser should throw a SyntaxException.  If the sentence is legal, the parse method should simply return.
  • Use the approach described in the lectures to systematically build the parser. Identify whether the language is LL(1) or not.

 

 

Turn in a jar file containing your source code Parser.java, Scanner.java, and ParserTest.java. 

 

Your ParserTest will not be graded, but may be looked at in case of academic honesty issues.   We will subject your parser to our set of unit tests and your grade will be determined solely by how many tests are passed.  Name your jar file in the following format:

firstname_lastname_ufid_hw2.jar

 

 

Additional requirements:

  • This code must remain in package cop5556sp17(case sensitive): do not create additional packages.
  • Names (of classes, method, variables, etc.) in starter code must not be changed.
  • Unless otherwise specified, your code should not import any classes other than those from the standard Java distribution or your Scanner.java.

 

Submission Checklist

See the checklist from Assignment 1.

 

Comments and suggestions:

  • The given Parser.java and ParserTest.java should compile correctly when combined with your Scanner.java from Assignment 1. When executed, only one test will pass, but all should pass in your completed parser.
  • Work incrementally. Note that you can call the routines corresponding to fragments of the grammar in Junit tests.  For example, see the testFactor test in the provided code.
  • It is useful when working incrementally to ensure that you are not calling an unimplemented procedure without realizing it. To this end, the sample code throws an UnimplementedFeatureException in every method that has not yet been implemented.  After all of your methods have been implemented, you may delete the class for this exception to clean up your code.
  • You will want to provide better error messages than given in the sample code. In particular, you will want to output the location of the offending token.