projects
/
uebersetzerbau-ss10.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
fef6b13
)
ag: feinheiten
author
Bernhard Urban
<lewurm@gmail.com>
Tue, 30 Mar 2010 17:33:42 +0000
(19:33 +0200)
committer
Bernhard Urban
<lewurm@gmail.com>
Tue, 30 Mar 2010 17:51:00 +0000
(19:51 +0200)
ag/parser.y
patch
|
blob
|
history
diff --git
a/ag/parser.y
b/ag/parser.y
index b678961c091c53a8a3eabf609b9484655dbb411b..fe8edd04370632b288f8a2a36492a41b1a0827bf 100644
(file)
--- a/
ag/parser.y
+++ b/
ag/parser.y
@@
-9,15
+9,23
@@
%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
%token IDENT NUM ASSIGN
%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
%token IDENT NUM ASSIGN
-/* TODO: macro, see oxURM.ps @ p. 25 */
+@macro xxputsin(xx,)
+ @i xx = @Statement.sin@;
+@end
+
+@macro statinout()
+ @i @Statement.sout@ = @Statement.sin@;
+ /* das
+ *> xxputsin(@Statement.sout@,)
+ * geht nicht, weil verschachtelte macros deaktiviert sind */
+@end
@autoinh s
/* f .. fields
* s .. symbols */
@attributes { char *name; } IDENT
@attributes { struct symbol *f; struct symbol *s; } Program
@autoinh s
/* f .. fields
* s .. symbols */
@attributes { char *name; } IDENT
@attributes { struct symbol *f; struct symbol *s; } Program
-@attributes { struct symbol *f; } Idents Structdef
-@attributes { struct symbol *p; } Parms
+@attributes { struct symbol *f; } Idents Structdef Parms
@attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm
Term Exprs Feld
@attributes { struct symbol *sin; struct symbol *sout; } Statement
@attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm
Term Exprs Feld
@attributes { struct symbol *sin; struct symbol *sout; } Statement
@@
-25,7
+33,6
@@
Term Exprs Feld
@traversal @postorder c
%%
@traversal @postorder c
%%
-
Input:
Program
@{
Input:
Program
@{
@@
-48,15
+55,13
@@
Program:
@{
@i @Program.0.f@ = new_tab();
@}
@{
@i @Program.0.f@ = new_tab();
@}
-
;
Methoddef:
METHOD IDENT '(' Parms ')' Statseq END
@{
;
Methoddef:
METHOD IDENT '(' Parms ')' Statseq END
@{
- @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.
p
@, 0);
+ @i @Statseq.s@ = tab_merge(@Methoddef.s@, @Parms.
f
@, 0);
@}
@}
-
;
Structdef:
;
Structdef:
@@
-64,21
+69,19
@@
Structdef:
@{
@i @Structdef.f@ = @Idents.f@;
@}
@{
@i @Structdef.f@ = @Idents.f@;
@}
-
;
Parms:
/* lokale Vars werden in Statement in die tabelle eingefuegt */
IDENT Parms
@{
;
Parms:
/* lokale Vars werden in Statement in die tabelle eingefuegt */
IDENT Parms
@{
- @i @Parms.0.
p@ = tab_add_symbol(@Parms.1.p
@, @IDENT.name@, S_VAR, 1);
+ @i @Parms.0.
f@ = tab_add_symbol(@Parms.1.f
@, @IDENT.name@, S_VAR, 1);
@}
|
@{
@}
|
@{
- @i @Parms.
p
@ = new_tab();
+ @i @Parms.
f
@ = new_tab();
@}
@}
-
;
Idents:
;
Idents:
@@
-91,7
+94,6
@@
Idents:
@{
@i @Idents.f@ = new_tab();
@}
@{
@i @Idents.f@ = new_tab();
@}
-
;
Statseq:
;
Statseq:
@@
-102,57
+104,55
@@
Statseq:
@}
|
@}
|
-
;
Statement:
Lexpr ASSIGN Expr
@{
;
Statement:
Lexpr ASSIGN Expr
@{
- @i @Statement.sout@ = @Statement.sin@;
- @i @Lexpr.s@ = @Statement.sin@;
- @i @Expr.s@ = @Statement.sin@;
+ statinout()
+ xxputsin(@Lexpr.s@,)
+ xxputsin(@Expr.s@,)
@}
| VAR IDENT ASSIGN Expr
@{
@i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 1);
@}
| VAR IDENT ASSIGN Expr
@{
@i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 1);
- @i @Expr.s@ = @Statement.sin@;
+ xxputsin(@Expr.s@,)
@}
| Expr
@{
@}
| Expr
@{
- @i @Expr.s@ = @Statement.sin@;
- @i @Statement.sout@ = @Statement.sin@;
+ statinout()
+ xxputsin(@Expr.s@,)
@}
| IF Expr THEN Statseq END
@{
@}
| IF Expr THEN Statseq END
@{
- @i @Expr.s@ = @Statement.sin@;
- @i @Statseq.s@ = @Statement.sin@;
- @i @Statement.sout@ = @Statement.sin@;
+ statinout()
+ xxputsin(@Expr.s@,)
+ xxputsin(@Statseq.s@,)
@}
| IF Expr THEN Statseq ELSE Statseq END
@{
@}
| IF Expr THEN Statseq ELSE Statseq END
@{
- @i @Expr.s@ = @Statement.sin@;
- @i @Statseq.0.s@ = @Statement.sin@;
- @i @Statseq.1.s@ = @Statement.sin@;
- @i @Statement.sout@ = @Statement.sin@;
+ statinout()
+ xxputsin(@Expr.s@,)
+ xxputsin(@Statseq.0.s@,)
+ xxputsin(@Statseq.1.s@,)
@}
| WHILE Expr DO Statseq END
@{
@}
| WHILE Expr DO Statseq END
@{
- @i @Expr.s@ = @Statement.sin@;
- @i @Statseq.s@ = @Statement.sin@;
- @i @Statement.sout@ = @Statement.sin@;
+ statinout()
+ xxputsin(@Expr.s@,)
+ xxputsin(@Statseq.s@,)
@}
| RETURN Expr
@{
@}
| RETURN Expr
@{
- @i @Expr.s@ = @Statement.sin@;
- @i @Statement.sout@ = @Statement.sin@;
+ statinout()
+ xxputsin(@Expr.s@,)
@}
@}
-
;
Lexpr:
;
Lexpr:
@@
-168,7
+168,6
@@
Feld: Term '.' IDENT
@{
@c check_field(@Feld.s@, @IDENT.name@);
@}
@{
@c check_field(@Feld.s@, @IDENT.name@);
@}
-
;
Expr:
;
Expr:
@@
-196,7
+195,6
@@
Orterm:
| OR Term
;
| OR Term
;
-
Term:
'(' Expr ')'
| NUM
Term:
'(' Expr ')'
| NUM
@@
-217,7
+215,6
@@
Term:
@{
@c check_variable(@Term.s@, @IDENT.name@);
@}
@{
@c check_variable(@Term.s@, @IDENT.name@);
@}
-
;
/* beachte dass hier auch "nichts" vorkommen kann
;
/* beachte dass hier auch "nichts" vorkommen kann
@@
-227,7
+224,6
@@
Exprs:
| Expr
| Exprs ',' Expr
;
| Expr
| Exprs ',' Expr
;
-
%%
extern int yylex();
%%
extern int yylex();