diff options
| author | bringert <bringert@cs.chalmers.se> | 2005-11-30 20:27:01 +0000 |
|---|---|---|
| committer | bringert <bringert@cs.chalmers.se> | 2005-11-30 20:27:01 +0000 |
| commit | 7dfa1842859b408d0eadd4d79a5b1ce0267a13b2 (patch) | |
| tree | 983536942b3836c01033612fb358a619a3505bf0 /src/Transfer/Syntax/Par.y | |
| parent | d92a26fc9be92fb269888947a8b26aa12883065e (diff) | |
Added bind operators, do-notation, a cons operator and list sytnax.
Diffstat (limited to 'src/Transfer/Syntax/Par.y')
| -rw-r--r-- | src/Transfer/Syntax/Par.y | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/src/Transfer/Syntax/Par.y b/src/Transfer/Syntax/Par.y index 5bb795c0f..313977c77 100644 --- a/src/Transfer/Syntax/Par.y +++ b/src/Transfer/Syntax/Par.y @@ -23,7 +23,10 @@ import Transfer.ErrM ')' { PT _ (TS ")") } '_' { PT _ (TS "_") } '->' { PT _ (TS "->") } + '<-' { PT _ (TS "<-") } '\\' { PT _ (TS "\\") } + '>>=' { PT _ (TS ">>=") } + '>>' { PT _ (TS ">>") } '||' { PT _ (TS "||") } '&&' { PT _ (TS "&&") } '==' { PT _ (TS "==") } @@ -32,17 +35,22 @@ import Transfer.ErrM '<=' { PT _ (TS "<=") } '>' { PT _ (TS ">") } '>=' { PT _ (TS ">=") } + '::' { PT _ (TS "::") } '+' { PT _ (TS "+") } '-' { PT _ (TS "-") } '*' { PT _ (TS "*") } '/' { PT _ (TS "/") } '%' { PT _ (TS "%") } '.' { PT _ (TS ".") } + '[' { PT _ (TS "[") } + ']' { PT _ (TS "]") } '?' { PT _ (TS "?") } + ',' { PT _ (TS ",") } 'Type' { PT _ (TS "Type") } 'case' { PT _ (TS "case") } 'data' { PT _ (TS "data") } 'derive' { PT _ (TS "derive") } + 'do' { PT _ (TS "do") } 'else' { PT _ (TS "else") } 'if' { PT _ (TS "if") } 'import' { PT _ (TS "import") } @@ -137,6 +145,7 @@ Exp :: { Exp } Exp : 'let' '{' ListLetDef '}' 'in' Exp { ELet $3 $6 } | 'case' Exp 'of' '{' ListCase '}' { ECase $2 $5 } | 'if' Exp 'then' Exp 'else' Exp { EIf $2 $4 $6 } + | 'do' '{' ListBind Exp '}' { EDo (reverse $3) $4 } | Exp1 { $1 } @@ -160,6 +169,16 @@ ListCase : {- empty -} { [] } | Case ';' ListCase { (:) $1 $3 } +Bind :: { Bind } +Bind : VarOrWild '<-' Exp { BindVar $1 $3 } + | Exp { BindNoVar $1 } + + +ListBind :: { [Bind] } +ListBind : {- empty -} { [] } + | ListBind Bind ';' { flip (:) $1 $2 } + + Exp2 :: { Exp } Exp2 : '\\' VarOrWild '->' Exp { EAbs $2 $4 } | '(' VarOrWild ':' Exp ')' '->' Exp { EPi $2 $4 $7 } @@ -173,56 +192,68 @@ VarOrWild : Ident { VVar $1 } Exp3 :: { Exp } -Exp3 : Exp4 '||' Exp3 { EOr $1 $3 } +Exp3 : Exp3 '>>=' Exp4 { EBind $1 $3 } + | Exp3 '>>' Exp4 { EBindC $1 $3 } | Exp4 { $1 } Exp4 :: { Exp } -Exp4 : Exp5 '&&' Exp4 { EAnd $1 $3 } +Exp4 : Exp5 '||' Exp4 { EOr $1 $3 } | Exp5 { $1 } Exp5 :: { Exp } -Exp5 : Exp6 '==' Exp6 { EEq $1 $3 } - | Exp6 '/=' Exp6 { ENe $1 $3 } - | Exp6 '<' Exp6 { ELt $1 $3 } - | Exp6 '<=' Exp6 { ELe $1 $3 } - | Exp6 '>' Exp6 { EGt $1 $3 } - | Exp6 '>=' Exp6 { EGe $1 $3 } +Exp5 : Exp6 '&&' Exp5 { EAnd $1 $3 } | Exp6 { $1 } Exp6 :: { Exp } -Exp6 : Exp6 '+' Exp7 { EAdd $1 $3 } - | Exp6 '-' Exp7 { ESub $1 $3 } +Exp6 : Exp7 '==' Exp7 { EEq $1 $3 } + | Exp7 '/=' Exp7 { ENe $1 $3 } + | Exp7 '<' Exp7 { ELt $1 $3 } + | Exp7 '<=' Exp7 { ELe $1 $3 } + | Exp7 '>' Exp7 { EGt $1 $3 } + | Exp7 '>=' Exp7 { EGe $1 $3 } | Exp7 { $1 } Exp7 :: { Exp } -Exp7 : Exp7 '*' Exp8 { EMul $1 $3 } - | Exp7 '/' Exp8 { EDiv $1 $3 } - | Exp7 '%' Exp8 { EMod $1 $3 } +Exp7 : Exp8 '::' Exp7 { EListCons $1 $3 } | Exp8 { $1 } Exp8 :: { Exp } -Exp8 : '-' Exp8 { ENeg $2 } +Exp8 : Exp8 '+' Exp9 { EAdd $1 $3 } + | Exp8 '-' Exp9 { ESub $1 $3 } | Exp9 { $1 } Exp9 :: { Exp } -Exp9 : Exp9 Exp10 { EApp $1 $2 } +Exp9 : Exp9 '*' Exp10 { EMul $1 $3 } + | Exp9 '/' Exp10 { EDiv $1 $3 } + | Exp9 '%' Exp10 { EMod $1 $3 } | Exp10 { $1 } Exp10 :: { Exp } -Exp10 : Exp10 '.' Ident { EProj $1 $3 } +Exp10 : '-' Exp10 { ENeg $2 } | Exp11 { $1 } Exp11 :: { Exp } -Exp11 : 'sig' '{' ListFieldType '}' { ERecType $3 } +Exp11 : Exp11 Exp12 { EApp $1 $2 } + | Exp12 { $1 } + + +Exp12 :: { Exp } +Exp12 : Exp12 '.' Ident { EProj $1 $3 } + | Exp13 { $1 } + + +Exp13 :: { Exp } +Exp13 : 'sig' '{' ListFieldType '}' { ERecType $3 } | 'rec' '{' ListFieldValue '}' { ERec $3 } + | '[' ListExp ']' { EList $2 } | Ident { EVar $1 } | 'Type' { EType } | String { EStr $1 } @@ -255,6 +286,12 @@ Exp1 :: { Exp } Exp1 : Exp2 { $1 } +ListExp :: { [Exp] } +ListExp : {- empty -} { [] } + | Exp { (:[]) $1 } + | Exp ',' ListExp { (:) $1 $3 } + + { |
