home
/
code
/
tiger.ml.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Assign precedence and associativity to ELSE
[tiger.ml.git]
/
tiger
/
src
/
lib
/
tiger
/
tiger_parser.mly
diff --git
a/tiger/src/lib/tiger/tiger_parser.mly
b/tiger/src/lib/tiger/tiger_parser.mly
index
a415ae7
..
625632f
100644
(file)
--- a/
tiger/src/lib/tiger/tiger_parser.mly
+++ b/
tiger/src/lib/tiger/tiger_parser.mly
@@
-49,6
+49,9
@@
%token WHILE
/* from lowest precedence */
%token WHILE
/* from lowest precedence */
+%left ELSE
+%nonassoc ASSIGN
+%left OF DO
%left OR
%left AND
%nonassoc EQ NEQ GT LT GE LE
%left OR
%left AND
%nonassoc EQ NEQ GT LT GE LE
@@
-68,6
+71,7
@@
program:
{
sprintf "program[%s]" $1
}
{
sprintf "program[%s]" $1
}
+ ;
exp:
| NIL
exp:
| NIL
@@
-85,9
+89,11
@@
exp:
| ID LBRACK exp RBRACK OF exp
{
let type_id = $1 in
| ID LBRACK exp RBRACK OF exp
{
let type_id = $1 in
- let exp_1 = $3 in
- let exp_2 = $6 in
- sprintf "array[type[%s], size[%s], val[%s]]" type_id exp_1 exp_2
+ let number_of_elements = $3 in
+ let initial_value = $6 in
+ sprintf
+ "array[type[%s], size[%s], val[%s]]"
+ type_id number_of_elements initial_value
}
| ID LBRACE rec_field_assignments RBRACE
{
}
| ID LBRACE rec_field_assignments RBRACE
{
@@
-166,16
+172,37
@@
exp:
(* Perhaps "void"? *)
"unit[]"
}
(* Perhaps "void"? *)
"unit[]"
}
+ ;
+
+rec_field_assignments:
+ | ID EQ exp
+ {
+ let id = $1 in
+ let exp = $3 in
+ sprintf "%S = %s" id exp
+ }
+ | ID EQ exp COMMA rec_field_assignments
+ {
+ let id = $1 in
+ let exp = $3 in
+ let rec_field_assignments = $5 in
+ sprintf "%S = %s, %s" id exp rec_field_assignments
+ }
+ ;
exps:
| exp
{
exps:
| exp
{
- sprintf "%s" $1
+ let exp = $1 in
+ sprintf "%s" exp
}
| exp SEMICOLON exps
{
}
| exp SEMICOLON exps
{
- sprintf "%s; %s" $1 $3
+ let exp = $1 in
+ let exps = $3 in
+ sprintf "%s; %s" exp exps
}
}
+ ;
decs:
| dec
decs:
| dec
@@
-186,6
+213,7
@@
decs:
{
sprintf "%s %s" $1 $2
}
{
sprintf "%s %s" $1 $2
}
+ ;
dec:
/* Tydec */
dec:
/* Tydec */
@@
-252,40
+280,24
@@
dec:
"fundec[%s, tyfields[%s], type_id[%s], exp[%s]]"
id tyfields type_id exp
}
"fundec[%s, tyfields[%s], type_id[%s], exp[%s]]"
id tyfields type_id exp
}
+ ;
tyfields:
tyfields:
-/*| epsilon */
- | tyfield
- {$1}
- | tyfield COMMA tyfields
- {
- let tyfield = $1 in
- let tyfields = $3 in
- sprintf "%s, %s" tyfield tyfields
- }
-
-tyfield:
| ID COLON ID
{
| ID COLON ID
{
- let id = $1 in
- let type_id = $3 in
- sprintf "tyfield[%s, %s]" id type_id
- }
-
-rec_field_assignments:
- | ID EQ exp
- {
- let id = $1 in
- let exp = $3 in
- sprintf "%S = %s" id exp
+ let id_1 = $1 in
+ let id_2 = $3 in
+ sprintf "%s : %s" id_1 id_2
}
}
- | ID
EQ exp COMMA rec_field_assignment
s
+ | ID
COLON ID COMMA tyfield
s
{
{
- let id = $1 in
- let exp = $3 in
- let rec_field_assignments = $5 in
- sprintf "%S = %s, %s" id exp rec_field_assignments
+ let id_1 = $1 in
+ let id_2 = $3 in
+ let tyfield = sprintf "%s : %s" id_1 id_2 in
+ let tyfields = $5 in
+ sprintf "%s, %s" tyfield tyfields
}
}
+ ;
fun_args:
| exp
fun_args:
| exp
@@
-296,6
+308,7
@@
fun_args:
{
sprintf "%s, %s" $1 $3
}
{
sprintf "%s, %s" $1 $3
}
+ ;
op:
| PLUS {"+"}
op:
| PLUS {"+"}
@@
-310,24
+323,37
@@
op:
| LE {"<="}
| AND {"&"}
| OR {"|"}
| LE {"<="}
| AND {"&"}
| OR {"|"}
+ ;
lvalue:
lvalue:
- | ID
+ | ID
lvalue_part
{
let id = $1 in
{
let id = $1 in
- sprintf "lvalue[%s]" id
+ let part = $2 in
+ sprintf "lvalue[%s, part[%s]]" id part
}
}
- | lvalue DOT ID
+ ;
+
+lvalue_part:
+ | {"epsilon[]"}
+ | lvalue_subscript {$1}
+ | lvalue_field_access {$1}
+ ;
+
+lvalue_subscript:
+ | LBRACK exp RBRACK
{
{
- let record = $1 in
- let field = $3 in
- sprintf "get_record_field[%s, %s]" record field
+ let exp = $2 in
+ sprintf "subscript[%s]" exp
}
}
- | lvalue LBRACK exp RBRACK
+ ;
+
+lvalue_field_access:
+ | DOT ID
{
{
- let array = $1 in
- let subscript = $3 in
- sprintf "get_array_subscript[%s, %s]" array subscript
+ let field = $2 in
+ sprintf "field_access[%s]" field
}
}
+ ;
%%
%%
This page took
0.030779 seconds
and
4
git commands to generate.