diff options
| author | aarne <unknown> | 2004-09-19 20:27:01 +0000 |
|---|---|---|
| committer | aarne <unknown> | 2004-09-19 20:27:01 +0000 |
| commit | df4cbb482f0546b884eb210d825c794d14f82712 (patch) | |
| tree | cc8ecc187cdd2ce07926308ee1656a1fa3a213b7 /examples/gfcc/ImperC.gf | |
| parent | 3a1f403a0146f4717b210373167640a07f0248dd (diff) | |
report
Diffstat (limited to 'examples/gfcc/ImperC.gf')
| -rw-r--r-- | examples/gfcc/ImperC.gf | 71 |
1 files changed, 25 insertions, 46 deletions
diff --git a/examples/gfcc/ImperC.gf b/examples/gfcc/ImperC.gf index ec78504f3..b6396456a 100644 --- a/examples/gfcc/ImperC.gf +++ b/examples/gfcc/ImperC.gf @@ -1,58 +1,16 @@ ---# -path=.:../prelude - -concrete ImperC of Imper = open Prelude, Precedence, ResImper in { - -flags lexer=codevars ; unlexer=code ; startcat=Stm ; - --- code inside function bodies +concrete ImperC of Imper = open ResImper in { + flags lexer=codevars ; unlexer=code ; startcat=Stm ; lincat - Stm = SS ; - Typ = SS ; Exp = PrecExp ; - Var = SS ; - - lin - Decl typ cont = continue (typ.s ++ cont.$0) cont ; - Assign _ x exp = continue (x.s ++ "=" ++ ex exp) ; - Return _ exp = statement ("return" ++ ex exp) ; - While exp loop = continue ("while" ++ paren (ex exp) ++ loop.s) ; - Block stm = continue ("{" ++ stm.s ++ "}") ; - End = statement [] ; - - EVar _ x = constant x.s ; - EInt n = constant n.s ; - EFloat a b = constant (a.s ++ "." ++ b.s) ; - EMulI = infixL p3 "*" ; - EMulF = infixL p3 "*" ; - EAddI = infixL p2 "+" ; - EAddF = infixL p2 "+" ; - ELtI = infixN p1 "<" ; - ELtF = infixN p1 "<" ; - - TInt = ss "int" ; - TFloat = ss "float" ; - --- top-level code consisting of function definitions - - lincat - Program = SS ; - Typs = SS ; - Fun = SS ; Body = {s,s2 : Str ; size : Size} ; - Exps = {s : Str ; size : Size} ; + ListExp = {s : Str ; size : Size} ; lin Empty = ss [] ; Funct args val body cont = ss ( val.s ++ cont.$0 ++ paren body.s2 ++ "{" ++ - body.s ++ - "}" ++ ";" ++ - cont.s - ) ; - - NilTyp = ss [] ; - ConsTyp = cc2 ; + body.s ++ "}" ++ ";" ++ cont.s) ; BodyNil stm = stm ** {s2 = [] ; size = Zero} ; BodyCons typ _ body = { @@ -61,8 +19,29 @@ flags lexer=codevars ; unlexer=code ; startcat=Stm ; size = nextSize body.size } ; + Decl typ cont = continues (typ.s ++ cont.$0) cont ; + Assign _ x exp = continues (x.s ++ "=" ++ ex exp) ; + Return _ exp = statement ("return" ++ ex exp) ; + While exp loop = continue ("while" ++ paren (ex exp) ++ loop.s) ; + IfElse exp t f = continue ("if" ++ paren (ex exp) ++ t.s ++ "else" ++ f.s) ; + Block stm = continue ("{" ++ stm.s ++ "}") ; + End = ss [] ; + + EVar _ x = constant x.s ; + EInt n = constant n.s ; + EFloat a b = constant (a.s ++ "." ++ b.s) ; + EMulI, EMulF = infixL P2 "*" ; + EAddI, EAddF = infixL P1 "+" ; + ESubI, ESubF = infixL P1 "-" ; + ELtI, ELtF = infixN P0 "<" ; + EApp args val f exps = constant (f.s ++ paren exps.s) ; + TInt = ss "int" ; + TFloat = ss "float" ; + NilTyp = ss [] ; + ConsTyp = cc2 ; + NilExp = ss [] ** {size = Zero} ; ConsExp _ _ e es = { s = ex e ++ separator "," es.size ++ es.s ; |
