macrojava spec
Goal
::=
(
MacroDefinition
)*
MainClass
(
TypeDeclaration
)* <EOF>
MainClass
::=
class
Identifier
{ public static void main ( String []
Identifier
) { System.out.println (
Expression
); } }
TypeDeclaration
::=
class
Identifier
{ (
Type
Identifier
;)* (
MethodDeclaration
)* }
|
class
Identifier
extends
Identifier
{ (
Type
Identifier
;)* (
MethodDeclaration
)* }
MethodDeclaration
::=
public
Type
Identifier
( (
Type
Identifier
(,
Type
Identifier
)*)? ) { (
Type
Identifier
;)* (
Statement
)* return
Expression
; }
Type
::=
int [ ]
|
boolean
|
int
|
Identifier
Statement
::=
{ (
Statement
)* }
|
System.out.println (
Expression
);
|
Identifier
=
Expression
;
|
Identifier
[
Expression
] =
Expression
;
|
if (
Expression
)
Statement
|
if (
Expression
)
Statement
else
Statement
|
while (
Expression
)
Statement
|
Identifier
( (
Expression
(,
Expression
)*)?);
/* Macro stmt call */
Expression
::=
PrimaryExpression
&
PrimaryExpression
|
PrimaryExpression
<
PrimaryExpression
|
PrimaryExpression
+
PrimaryExpression
|
PrimaryExpression
-
PrimaryExpression
|
PrimaryExpression
*
PrimaryExpression
|
PrimaryExpression
/
PrimaryExpression
|
PrimaryExpression
[
PrimaryExpression
]
|
PrimaryExpression
. length
|
PrimaryExpression
|
PrimaryExpression
.
Identifier
( (
Expression
(,
Expression
)*)? )
|
Identifier
( (
Expression
(,
Expression
)*)? )
/* Macro expr call */
PrimaryExpression
::=
<INTEGER_LITERAL>
|
true
|
false
|
Identifier
|
this
|
new int [
Expression
]
|
new
Identifier
( )
|
!
Expression
|
(
Expression
)
MacroDefinition
::=
MacroDefExpression
|
MacroDefStatement
MacroDefStatement
::=
#define
Identifier
( (
Identifier
(,
Identifier
)*)? ) { (
Statement
)* }
MacroDefExpression
::=
#define
Identifier
( (
Identifier
(,
Identifier
)*)? ) (
Expression
)
Identifier
::=
<IDENTIFIER>