Objectives.
1. Support multiline comments.
-
Supportadditional tokens (reserved words, operators, and separators).
-
Support long and double
In this project, you will only be updating the hand-crafted scanner, which means that the only program files you will be modifying under $j/j–/src/jminusminus are TokenInfo.java and Scanner.java.
Run the following command inside the $j directory to compile the j– compiler with your changes.
$ ant clean com pile jar
Run the following command to compile (just scan for now) a j– program P.java using the j– compiler.
$ sh $j /j - -/ bin /j - - -t P . java
which only scans P.java and prints the tokens in the program along with the line number where each token appears.
Problem 1. (Multiline Comment ) Add support for multiline comment, where all the text from the ASCII characters /* to the ASCII characters */ is ignored.
$j /j - -/ bin /j - - -t tests / M ultiL ineC om m ent . java 5 : public = public 5 : class = class 5 : < IDENTIFIER > = M ultiL ineC om m ent 5 : { = { 9 : public = public 9 : static = static 9 : void = void 9 : < IDENTIFIER > = main 9 : ( = ( 9 : < IDENTIFIER > = S tring 9 : [ = [ 9 : ] = ] 9 : < IDENTIFIER > = args 9 : ) = ) 9 : { = { 13 : } = } 14 : } = } 15 : < EOF > = < EOF >
Problem 2. (Reserved Words) Add support for the following reserved words.
break | case | catch |
continue | default | do |
double | final | finally |
for | im plem ents | interface |
long | sw itch | throw |
throw s | try |
$j /j - -/ bin /j - - -t tests / R eserved W ords . java 1 : break = break 1 : case = case 1: catch =catch 2: continue =continue 2 : default = default 2: do =do 3: double =double 3 : final = final 3: finally =finally 4: for =for 4 : im plem ents = im plem ents 4 : interface = interface
Problem 3. (Operators) Add support for the following operators.
? | ~ | != | / | /= |
-= | — | *= | = | |
>> | > >= | > > > | > > >= | >= |
<< | < <= | < | ^ | ^= |
| | |= | || | & | &= |
$ $j /j - -/ bin /j - - -t tests / O perators . java 1 : ? = ? 1 : ~ = ~ 1 : != = != 1 : / = / 1 : /= = /= 2 : -= = -= 2 : -- = -- 2 : *= = *= 2 : = 2 : = = = 3 : >> = >> 3 : > >= = > >= 3 : > > > = > > > 3 : > > >= = > > >= 3 : >= = >= 4 : << = << 4 : < <= = < <= 4 : < = < 4 : ^ = ^ 4 : ^= = ^= 5 : | = | 5 : |= = |= 5 : || = || 5 : & = & 5 : &= = &= 6 : < EOF > = < EOF >
Problem 4. (Separators) Add support for the separator : (colon).
$ $j /j - -/ bin /j - - -t tests / S eparators . java 1 : ; = ; 2 : : = : 3 : , = , 4 : . = . 5 : [ = [ 5 : { = { 5 : ( = ( 5 : ) = ) 5 : } = } 5 : ] = ] 6 : < EOF > = < EOF >
Problem 5. (Literals) Add support for (just decimal for now) long and double literals.
< int_literal > = 0 | (1 -9) {0 -9} // decim al < long_literal > = < int_literal > ( l | L ) < digits > = (0 -9) {0 -9} < exponent > = ( e | E ) [(+ | -)] < digits > < suffix > = d | D < double_literal > = < digits > . [< digits >] [< exponent >] [< suffix >] | . < digits > [< exponent >] [< suffix >] | < digits > < exponent > [< suffix >] | < digits > [< exponent >] < suffix >
$ $j /j - -/ bin /j - - -t tests / L iterals . java 1 : < IN T _LIT E R A L > = 0 1 : < IN T _LIT E R A L > = 2 1: < IN T _LIT E R A L > = 372 2:< L O N G _L IT E R A L > = 1996 l 2 : < L O N G _L IT E R A L > = 777 L 2:< D O U B L E _L IT E R A L > = .3 D 3:< D O U B L E _L IT E R A L > = 14 3 : < D O U B L E _L IT E R A L > = 6.022137 e +23 3:< D O U B L E _L IT E R A L > = 1e -9 d 4: < EOF > = < EOF>
Files to Submit
- j–.tar.gz(j– source tree as a single gzip file)
- txt (projectreport)
Before you submit:
- Make sure you create the gzip file j–.tar.gzsuch that it only includes the source files and not the binaries, which
-
$ cd $j /j -- $ ant clean $ cd .. $ tar - cvf j - -. tar j - -/* $ gzip j - -. tar
- Makesure your report isn’t too verbose, doesn’t contain lines that exceed 80 characters, and doesn’t contain
1. Hours to complete the project: 24 hours
2. Provide a short description of how you approached each problem, issues you
encountered, and how you resolved those issues.
Report text:
1. Hours to complete the project: 24 hours 2. Provide a short description of how you approached each problem, issues you encountered, and how you resolved those issues. Part I (Additions to JavaCC Scanner) Problem 1 (Multiline Comment): Problem 1 just add a skip comment as single-line skip comment to skip the multiline comment in j--.jj. (SKIP: {<MULTI_LINE_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/">}) Problem 2 (Reserved Words): Problem 2 just add some reserved words in the Token at j--.jj. Please pay attention to the "default", you can just use DEFAULT to identify it, because lexical token name "DEFAULT" is the same as that of a lexical state. So I just change "DEFAULT" to "DEFAULt" (lower-case T). Problem 3 (Operators): In Problem 3, I define the operators in Token first, then define them in different expression method, for instance, "/=" should be define in assignment expression, and "||" should be define in Conditional-Or- Expression. Just like what we did in Parser. Problem 4 (Separators): In Problem 4, I define the colon separator in Token at j--.jj first, and then define it in conditionalExpression method. Problem 5 (Literals): In Problem 5, I define the double and long literals in Token at j--.jj according to the format that problem 5 provided. Part II (Additions to JavaCC Parser) Problem 6 (Long and Double Basic Types): For problem 6, I wrote the java code for double and long literals. Then, I defined their types in basictype(). Problem 7 (Operators): In j--.jj, I defined the operators in different expression method. For instance, "/=" should be define in assignment expression, and "||" should be define in ConditionalOrExpression. Just like what we did in Parser. Problem 8 (Conditional Expression): In j--.jj, I created a new method called conditionalExpression and defined them in this method. In conditionalExpression method, assignment- Expression() will be called and check the colon token is there, then call conditionalExpression to get the conditional expression and return JCon- ditionalExpression object. Problem 9 (Switch Statement): In j--.jj, I created a JSwitchBlockStatement J-class to represent the switch block, and also created the J-class JSwitchStatement for the switch statement. I defined the "switch" in the statement(). Then I created the switchBlockStatementGroup() for JSwitchBlockStatement and switchLabel() to check the expression. Problem 10 (Do-While Statement): In problem 10, I added a do statement with while statement in statement() at j--.jj. Problem 11 (For Statement): In problem 11, I followed what I did in parser to added the for statement in statement(). Please be careful that you should update the statement expression so that an expression can be an instanceOf a pre-decrement or post-increment object. Problem 12 (Exception Handlers): I wrote some J-class. JThrowStatement is for the throw statement. JCatch is for the try statement and JCatch is for the catch statement. And in the statement(), they all represent exception handlers so I do not separated them. Moreover, I also defined throw in member declaration and interface- member-declaration. Problem 13 (Interface Type Declaration): In j--.jj, I defined the interface in typeDeclaration method. Then I created the interfaceDeclaration() and interfaceBody() method as what I did in parser. And I also defined the implement in class declaration and interface declaration. 3. Did you receive help from anyone? List their names, status (classmate, CS451/651 grad, TA, other), and the nature of help received. Name Status Help Received ---- ------ ------------- ... ... ... 4. List any other comments here. Feel free to provide any feedback on how much you learned from doing the assignment, and whether you enjoyed doing it. The homework 4 is tough for me. It is based on the completed homework 3, and do the same things in j--.jj as what you did in parser. However, I did not finish the homework 3 very well so I spent a lot of time to do this assignment and fixed the works.