X-Git-Url: https://ruin.nu/git/?p=proglang.git;a=blobdiff_plain;f=Parsyntax.y;h=02e94b0bc4803b1a1ac5ca5f525de11cc3e348f1;hp=461c967b366f8bf473c2b90877643b884aac1490;hb=565fbd61dca527c23888e08783d0d91cee458524;hpb=3cee522d1f54b39a1efa654da364c6c939cbcf1f diff --git a/Parsyntax.y b/Parsyntax.y index 461c967..02e94b0 100644 --- a/Parsyntax.y +++ b/Parsyntax.y @@ -14,10 +14,10 @@ import ErrM %tokentype { Token } %token - '=' { PT _ (TS "=") } ';' { PT _ (TS ";") } '{' { PT _ (TS "{") } '}' { PT _ (TS "}") } + '=' { PT _ (TS "=") } '(' { PT _ (TS "(") } ')' { PT _ (TS ")") } '++' { PT _ (TS "++") } @@ -59,14 +59,25 @@ Bool : 'true' { True } | 'false' { False } +Type :: { Type } +Type : 'int' { TInt } + | 'bool' { TBool } + + +Stms :: { Stms } +Stms : ListStm { Program (reverse $1) } + + Stm :: { Stm } -Stm : Type Ident '=' Exp ';' { SDecl $1 $2 $4 } - | Type Ident ';' { decl_ $1 $2 } - | Exp ';' { SExp $1 } +Stm : Exp ';' { SExp $1 } | '{' ListStm '}' { SBlock (reverse $2) } - | 'if' '(' Exp ')' Stm { if_ $3 $5 } - | 'if' '(' Exp ')' Stm 'else' Stm { SIf $3 $5 $7 } + | 'int' Ident '=' Exp ';' { declIntE_ $2 $4 } + | 'bool' Ident '=' Exp ';' { declBoolE_ $2 $4 } + | 'int' Ident ';' { declInt_ $2 } + | 'bool' Ident ';' { declBool_ $2 } | 'while' '(' Exp ')' Stm { SWhile $3 $5 } + | 'if' '(' Exp ')' Stm 'else' Stm { SIf $3 $5 $7 } + | 'if' '(' Exp ')' Stm { if_ $3 $5 } | 'print' Exp ';' { SPrint $2 } @@ -91,9 +102,9 @@ Exp3 : Ident '++' { postIncr_ $1 } | Ident '--' { postDecr_ $1 } | Ident { EVar $1 } | Integer { EInt $1 } + | Bool { EBool $1 } | '-' Exp3 { ENeg $2 } | '!' Exp3 { ENot $2 } - | Bool { EBool $1 } | 'readInt' { EReadI } | 'readBool' { EReadB } | '(' Exp ')' { $2 } @@ -104,10 +115,6 @@ ListStm : {- empty -} { [] } | ListStm Stm { flip (:) $1 $2 } -Stms :: { Stms } -Stms : ListStm { Program (reverse $1) } - - Op0 :: { Op } Op0 : '<' { Lt } | '<=' { ELt } @@ -133,11 +140,6 @@ Op : Op1 { $1 } | Op0 { $1 } -Type :: { Type } -Type : 'int' { TInt } - | 'bool' { TBool } - - { @@ -152,7 +154,10 @@ happyError ts = Bad $ "syntax error at " ++ tokenPos ts ++ if null ts then [] else (" before " ++ unwords (map prToken (take 4 ts))) myLexer = tokens -decl_ t_ v_ = SDecl t_ v_ EDefault +declIntE_ x_ e_ = SDecl TInt x_ e_ +declBoolE_ x_ e_ = SDecl TBool x_ e_ +declInt_ x_ = SDecl TInt x_ (EInt 0) +declBool_ x_ = SDecl TBool x_ (EBool False) if_ e_ s_ = SIf e_ s_ SNoop compExp_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_ op1_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_