CS451 Project 1
Hello, dear friend, you can consult us at any time if you have any questions, add WeChat: daixieit
Project 1 (Supporting Simple Operations)
Goal
1. Become familiar with CLEmitter .
2. Extend the base j-- language by adding some basic Java operations (on primitive integers) to the language. Supporting these operations requires studying the j-- compiler in its entirety, if only cursorily, and then making slight modifications to it.
Grammars
The lexical and syntactic grammars for j-- and Java can be found at https://www.cs.umb.edu/j--/grammar.pdf C.
Download and Test the j-- Compiler
Download and unzip the base j-- compiler C under some directory1 (we’ll refer to this directory as $j). Run the following command inside the $j/j-- directory to compile the j-- compiler.
&
~/workspace/j--
$ ant |
|
|
Run the following command to compile the j-- program $j/j- the JVM target program HelloWorld .class .
&
~/workspace/j--
$ bash . / bin /j - - tests / jvm / HelloWorld . java Run the following command to run HelloWorld .class . |
-/tests/jvm/HelloWorld.java using the j- |
- compiler, which produces |
&
~/workspace/j--
$ java HelloWorld Hello , World |
|
|
Download the Project Tests
Download and unzip the tests C for this project under $j/j-- .
Problem 1. (Using CLEmitter) Consider the following program IsPrime .java that accepts n (int) as command-line argument, and writes whether or not n is a prime number.
G IsPrime .java
public class IsPrime {
// Entry point .
public static void main ( String [] args ) {
int n = Integer . parseInt ( args [0]);
boolean result = isPrime ( n );
if ( result ) {
System . out . println ( n + " is a prime number " ); } else {
System . out . println ( n + " is not a prime number " );
}
}
// Returns true if n is prime , and false otherwise .
private static boolean isPrime ( int n ) {
if ( n < 2) {
return false ;
}
for ( int i = 2; i <= n / i ; i ++) {
if ( n % i == 0) {
return false ;
}
}
return
}
}
Using the annotated program GenFactorial .java under $j/j--/tests/clemitter as a model, complete the implementation of the program $j/j--/project1/GenIsPrime .java such that it uses the CLEmitter interface to programmatically generate IsPrime .class , ie, the JVM bytecode for the IsPrime .java program listed above.
一 ~/workspace/j--
$ bash . / bin / clemitter project1 / GenIsPrime . java
$ java IsPrime 42
42 is not a prime number $ java IsPrime 31
31 is a prime number
Directions: The bytecode for GenIsPrime .main() is similar to the bytecode for GenFactorial .main() . Here is the pseudocode for the isPrime() method:
if n >= 2 goto A :
return false
A : i = 2
D : if i > n / i goto B :
if n % i != 0 goto C :
return false
C : increment i by 1
goto D :
B : return True
Problem 2. (Arithmetic Operations) Implement the Java arithmetic operators: division / , remainder % , and unary plus + .
AST representations:
❼ JDivideOp in JBinaryExpression .java
❼ JRemainderOp in JBinaryExpression .java
❼ JUnaryPlusOp in JUnaryExpression .java
Semantics:
❼ The LHS and RHS operands of / and % must be ints.
❼ The operand of + must be an int.
一 ~/workspace/j--
$ bash . / bin /j - - project1 / Division . java
$ java Division 60 13
4
$ bash . / bin /j - - project1 / Remainder . java
$ java Remainder 60 13
8
$ bash . / bin /j - - project1 / UnaryPlus . java
$ java UnaryPlus 60
60
Directions:
❼ Define tokens for / and % in TokenInfo .java .
❼ Modify Scanner .java to scan / and % .
❼ Modify Parser .java to parse / and % , correctly capturing the precedence rules by parsing the operators in the right places.
❼ Implement the analyze() and codegen() methods in JDivideOp , JRemainderOp , and JUnaryPlusOp .
Problem 3. (Bitwise Operations) Implement the Java bitwise operators: unary complement ~ , inclusive or | , exclusive or ^ , and & .
AST representations:
❼ JComplementOp in JUnaryExpression .java
❼ JOrOp in JBinaryExpression .java
❼ JXorOp in JBinaryExpression .java
❼ JAndOp in JBinaryExpression .java
Semantics:
❼ The operand of ~ must be an int.
❼ The LHS and RHS operands of | , ^ , and & must be ints.
一 ~/workspace/j--
$ bash . / bin /j - - project1 / BitwiseNot . java
$ java BitwiseNot 60
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1
$ bash . / bin /j - - project1 / B i t w i s e I n c l u s i v e O r . java
java B i t w i s e I n c l u s i v e O r 60 13
111101
$ bash . / bin /j - - project1 / B i t w i s e E x c l u s i v e O r . java
$ java B i t w i s e E x c l u s i v e O r 60 13
110001
$ bash . / bin /j - - project1 / BitwiseAnd . java
$ java BitwiseAnd 60 13
1100
Directions:
❼ Define tokens for ~ , | , ^ , and & in TokenInfo .java .
❼ Modify Scanner .java to scan ~ , | , ^ , and & .
❼ Modify Parser .java to parse ~ , | , ^ , and & , capturing the precedence rules by parsing the operators in the right places.
❼ Implement the analyze() and codegen() methods in JComplementOp , JInclusiveOrOp , JExclusiveOrOp , and JAndOp .
Note: there are JVM instructions for | , ^ , and & , but not for ~ , which must be computed as the “exclusive or” of the operand and -1.
Problem 4. (Shift Operations) Implement the Java shift operators: arithmetic left shift << , arithmetic right shift >> , and logical right shift >>> .
AST representations:
❼ JALeftShiftOp in JBinaryExpression .java
❼ JARightShiftOp in JBinaryExpression .java
❼ JLRightShiftOp in JBinaryExpression .java
Semantics:
❼ The LHS and RHS operands of << , >> , and >>> must be ints.
一 ~/workspace/j--
$ bash . / bin /j - - project1 / ALeftShift . java
$ java ALeftShift - 1 16
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
$ bash . / bin /j - - project1 / ARightShift . java
$ java ARightShift - 1 16
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$ bash . / bin /j - - project1 / LRightShift . java
$ java LRightShift - 1 16
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Directions:
❼ Define tokens for << , >> , and >>> in TokenInfo .java .
❼ Modify Scanner .java to scan << , >> , and >>> .
❼ Modify Parser .java to parse << , >> , and >>> , capturing the precedence rules by parsing the operators in the right places.
❼ Implement the analyze() and codegen() methods in JALeftShiftOp , JARightShiftOp , and JLRightShiftOp .
Files to Submit
1. GenIsPrime .java
2. TokenInfo .java
3. Scanner .java
4. Parser .java
5. JBinaryExpression .java
6. JUnaryExpression .java
7. notes .txt
Before you submit your files, make sure: ❼ Your code is adequately commented and follows good programming principles. ❼ You update the notes .txt file. |
2023-02-08