Skip to content
This repository was archived by the owner on Oct 28, 2023. It is now read-only.

Commit dd8a433

Browse files
committed
added (final) refactoring to Mini Java grammar
fixes support for issue #18
1 parent e6dee70 commit dd8a433

File tree

6 files changed

+285
-21
lines changed

6 files changed

+285
-21
lines changed

example/mini-java/mini-java.annotated.bnf

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class-declaration = "class" class-name @ identifier [ "extends" extends @
1414
{ method-declaration }
1515
"}" ;
1616

17-
var-declaration = type variable @ identifier ";" ;
17+
var-declaration = type identifier ";" ;
1818

1919
method-declaration = "public" return-type @ type method-name @ identifier
2020
"(" [ type identifier { "," type identifier } ] ")" "{"
@@ -66,26 +66,25 @@ non-prefix-expression = times-expression
6666
| non-times-expression
6767
;
6868

69-
times-expression = non-times-expression "*" non-prefix-expression ;
69+
times-expression = lhs @ non-times-expression "*" rhs @ non-prefix-expression ;
7070

7171
non-times-expression = additive-expression
7272
| non-additive-expression
7373
;
7474

75-
additive-expression = non-additive-expression [ "+" | "-" ] non-times-expression ;
75+
additive-expression = lhs @ non-additive-expression ( "+" | "-" ) rhs @ non-times-expression ;
7676

7777
non-additive-expression = less-than-expression
7878
| non-less-than-expression
7979
;
8080

81-
less-than-expression = non-less-than-expression "<" non-additive-expression ;
81+
less-than-expression = lhs @ non-less-than-expression "<" rhs @ non-additive-expression ;
8282

8383
non-less-than-expression = and-expression
8484
| non-and-expression
8585
;
8686

87-
and-expression = non-and-expression "&&" non-less-than-expression ;
88-
87+
and-expression = lhs @ non-and-expression "&&" rhs @ non-less-than-expression ;
8988

9089
non-and-expression = group-expression
9190
| primary-expression
@@ -102,5 +101,5 @@ primary-expression = integer
102101
| identifier
103102
;
104103

105-
identifier = ? /([A-Za-z_][A-Za-z0-9-_]*)/ ? ;
104+
identifier = ? /([A-Za-z_][A-Za-z0-9_]*)/ ? ;
106105
integer = ? /(-?[1-9][0-9]*)/ ? ;

example/mini-java/mini-java.bnf

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,22 @@ main-class = "class" class-name @ identifier "{"
99
"}"
1010
"}" ;
1111

12-
class-declaration = "class" class-name @ identifier [ "extends" extends @ identifier ] "{"
12+
class-declaration = "class" class-name @ identifier [ _ @ "extends" extends @ identifier ] "{"
1313
{ var-declaration }
1414
{ method-declaration }
1515
"}" ;
1616

17-
var-declaration = type variable @ identifier ";" ;
17+
var-declaration = type identifier ";" ;
1818

1919
method-declaration = "public" return-type @ type method-name @ identifier
20-
"(" [ type identifier { "," type identifier } ] ")" "{"
20+
"(" [ parameter { _ @ "," parameter } ] ")" "{"
2121
{ var-declaration }
2222
{ statement }
2323
"return" returns @ expression ";"
2424
"}" ;
2525

26+
parameter = type identifier ;
27+
2628
type = primitive-type
2729
| list-type
2830
| complex-type
@@ -54,7 +56,7 @@ if-statement = "if" "(" condition @ expression ")"
5456
;
5557
while-statement = "while" "(" expression ")" statement ;
5658
print-statement = "System.out.print" [ "ln" ] "(" expression ")" ";" ;
57-
assignment-statement = variable @ identifier [ "[" index @ expression "]" ]
59+
assignment-statement = variable @ identifier [ _ @ "[" index @ expression _ @ "]" ]
5860
"=" expression ";"
5961
;
6062

@@ -69,7 +71,7 @@ postfix-expression = indexed-expression
6971

7072
indexed-expression = object @ non-postfix-expression "[" expression "]" ;
7173
method-call-expression = object @ non-postfix-expression "." identifier
72-
"(" [ argument @ expression { "," argument @ expression } ] ")" ;
74+
"(" [ argument @ expression { _ @ "," argument @ expression } ] ")" ;
7375
length-expression = object @ non-postfix-expression "." "length" ;
7476

7577
non-postfix-expression = prefix-expression
@@ -84,26 +86,27 @@ non-prefix-expression = times-expression
8486
| non-times-expression
8587
;
8688

87-
times-expression = non-times-expression "*" non-prefix-expression ;
89+
times-expression = lhs @ non-times-expression "*" rhs @ non-prefix-expression ;
8890

8991
non-times-expression = additive-expression
9092
| non-additive-expression
9193
;
9294

93-
additive-expression = non-additive-expression [ "+" | "-" ] non-times-expression ;
95+
additive-expression = lhs @ non-additive-expression operator @ addition-operator rhs @ non-times-expression ;
96+
97+
addition-operator = ? /(\+|-)/ ? ;
9498

9599
non-additive-expression = less-than-expression
96100
| non-less-than-expression
97101
;
98102

99-
less-than-expression = non-less-than-expression "<" non-additive-expression ;
103+
less-than-expression = lhs @ non-less-than-expression "<" rhs @ non-additive-expression ;
100104

101105
non-less-than-expression = and-expression
102106
| non-and-expression
103107
;
104108

105-
and-expression = non-and-expression "&&" non-less-than-expression ;
106-
109+
and-expression = lhs @ non-and-expression "&&" rhs @ non-less-than-expression ;
107110

108111
non-and-expression = group-expression
109112
| primary-expression
@@ -126,6 +129,6 @@ constructor-expression = "new" "int" "[" size @ expression "]"
126129
;
127130
identifier-expression = name @ identifier ;
128131

129-
identifier = ? /([A-Za-z_][A-Za-z0-9-_]*)/ ? ;
132+
identifier = ? /([A-Za-z_][A-Za-z0-9_]*)/ ? ;
130133
integer = ? /(-?[1-9][0-9]*)/ ? ;
131134
boolean = ? /(true|false)/ ? ;

example/mini-java/mini-java.generatable.bnf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ non-times-expression = additive-expression
6868
| non-additive-expression
6969
;
7070

71-
additive-expression = non-additive-expression [ "+" | "-" ] non-times-expression ;
71+
additive-expression = non-additive-expression ( "+" | "-" ) non-times-expression ;
7272

7373
non-additive-expression = less-than-expression
7474
| non-less-than-expression
@@ -98,5 +98,5 @@ primary-expression = integer
9898
| identifier
9999
;
100100

101-
identifier = ? /([A-Za-z_][A-Za-z0-9-_]*)/ ? ;
101+
identifier = ? /([A-Za-z_][A-Za-z0-9_]*)/ ? ;
102102
integer = ? /(-?[1-9][0-9]*)/ ? ;

example/mini-java/mini-java.left-recursion.bnf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,5 @@ Expression = Expression ( "&&" | "<" | "+" | "-" | "*" ) Expression
4848
| "(" Expression ")"
4949
;
5050

51-
Identifier = ? /([A-Za-z_][A-Za-z0-9-_]*)/ ? ;
51+
Identifier = ? /([A-Za-z_][A-Za-z0-9_]*)/ ? ;
5252
Integer = ? /(-?[1-9][0-9]*)/ ? ;
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
(* HPG Grammar for Mini Java *)
2+
(* https://github.com/christophevg/human-parser-generator/wiki/Tutorial-MiniJava *)
3+
4+
program = main-class { class-declaration } ;
5+
6+
main-class = "class" class-name @ identifier "{"
7+
"public" "static" "void" "main" "(" "String" "[" "]" args @ identifier ")" "{"
8+
statement
9+
"}"
10+
"}" ;
11+
12+
class-declaration = "class" class-name @ identifier [ "extends" extends @ identifier ] "{"
13+
{ var-declaration }
14+
{ method-declaration }
15+
"}" ;
16+
17+
var-declaration = type identifier ";" ;
18+
19+
method-declaration = "public" return-type @ type method-name @ identifier
20+
"(" [ type identifier { "," type identifier } ] ")" "{"
21+
{ var-declaration }
22+
{ statement }
23+
"return" returns @ expression ";"
24+
"}" ;
25+
26+
type = primitive-type
27+
| list-type
28+
| complex-type
29+
;
30+
31+
primitive-type = integer-type
32+
| boolean-type
33+
;
34+
35+
integer-type = "int" ;
36+
boolean-type = "boolean" ;
37+
38+
list-type = integer-type "[" "]";
39+
40+
complex-type = type @ identifier ;
41+
42+
statement = block-statement
43+
| if-statement
44+
| while-statement
45+
| print-statement
46+
| assignment-statement
47+
;
48+
49+
block-statement = "{" { statement } "}" ;
50+
if-statement = "if" "(" condition @ expression ")"
51+
true-statement @ statement
52+
"else"
53+
false-statement @ statement
54+
;
55+
while-statement = "while" "(" expression ")" statement ;
56+
print-statement = "System.out.print" [ "ln" ] "(" expression ")" ";" ;
57+
assignment-statement = variable @ identifier [ "[" index @ expression "]" ]
58+
"=" expression ";"
59+
;
60+
61+
expression = postfix-expression
62+
| non-postfix-expression
63+
;
64+
65+
postfix-expression = indexed-expression
66+
| method-call-expression
67+
| length-expression
68+
;
69+
70+
indexed-expression = object @ non-postfix-expression "[" expression "]" ;
71+
method-call-expression = object @ non-postfix-expression "." identifier
72+
"(" [ argument @ expression { "," argument @ expression } ] ")" ;
73+
length-expression = object @ non-postfix-expression "." "length" ;
74+
75+
non-postfix-expression = prefix-expression
76+
| non-prefix-expression
77+
;
78+
79+
prefix-expression = not-expression ;
80+
81+
not-expression = "!" prefix-expression ;
82+
83+
non-prefix-expression = times-expression
84+
| non-times-expression
85+
;
86+
87+
times-expression = lhs @ non-times-expression "*" rhs @ non-prefix-expression ;
88+
89+
non-times-expression = additive-expression
90+
| non-additive-expression
91+
;
92+
93+
additive-expression = lhs @ non-additive-expression ( "+" | "-" ) rhs @ non-times-expression ;
94+
95+
non-additive-expression = less-than-expression
96+
| non-less-than-expression
97+
;
98+
99+
less-than-expression = lhs @ non-less-than-expression "<" rhs @ non-additive-expression ;
100+
101+
non-less-than-expression = and-expression
102+
| non-and-expression
103+
;
104+
105+
and-expression = lhs @ non-and-expression "&&" rhs @ non-less-than-expression ;
106+
107+
non-and-expression = group-expression
108+
| primary-expression
109+
;
110+
111+
group-expression = "(" expression ")" ;
112+
113+
primary-expression = integer-expression
114+
| boolean-expression
115+
| this-expression
116+
| constructor-expression
117+
| identifier-expression
118+
;
119+
120+
integer-expression = value @ integer ;
121+
boolean-expression = value @ boolean ;
122+
this-expression = "this" ;
123+
constructor-expression = "new" "int" "[" size @ expression "]"
124+
| "new" class-name @ identifier "(" ")"
125+
;
126+
identifier-expression = name @ identifier ;
127+
128+
identifier = ? /([A-Za-z_][A-Za-z0-9_]*)/ ? ;
129+
integer = ? /(-?[1-9][0-9]*)/ ? ;
130+
boolean = ? /(true|false)/ ? ;

0 commit comments

Comments
 (0)