diff options
Diffstat (limited to 'src/Transfer/Core/Par.y')
| -rw-r--r-- | src/Transfer/Core/Par.y | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/src/Transfer/Core/Par.y b/src/Transfer/Core/Par.y new file mode 100644 index 000000000..23bb44de1 --- /dev/null +++ b/src/Transfer/Core/Par.y @@ -0,0 +1,193 @@ +-- This Happy file was machine-generated by the BNF converter +{ +module Transfer.Core.Par where +import Transfer.Core.Abs +import Transfer.Core.Lex +import Transfer.ErrM +} + +%name pModule Module +%name pExp Exp + +-- no lexer declaration +%monad { Err } { thenM } { returnM } +%tokentype { Token } + +%token + ';' { 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") } + 'in' { PT _ (TS "in") } + 'let' { PT _ (TS "let") } + 'of' { PT _ (TS "of") } + 'where' { PT _ (TS "where") } + +L_quoted { PT _ (TL $$) } +L_integ { PT _ (TI $$) } +L_CIdent { PT _ (T_CIdent $$) } +L_err { _ } + + +%% + +String :: { String } : L_quoted { $1 } +Integer :: { Integer } : L_integ { (read $1) :: Integer } +CIdent :: { CIdent} : L_CIdent { CIdent ($1)} + +Module :: { Module } +Module : ListDecl { Module $1 } + + +ListDecl :: { [Decl] } +ListDecl : {- empty -} { [] } + | Decl { (:[]) $1 } + | Decl ';' ListDecl { (:) $1 $3 } + + +Decl :: { Decl } +Decl : 'data' CIdent ':' Exp 'where' '{' ListConsDecl '}' { DataDecl $2 $4 $7 } + | CIdent ':' Exp { TypeDecl $1 $3 } + | CIdent '=' Exp { ValueDecl $1 $3 } + + +ConsDecl :: { ConsDecl } +ConsDecl : CIdent ':' Exp { ConsDecl $1 $3 } + + +ListConsDecl :: { [ConsDecl] } +ListConsDecl : {- empty -} { [] } + | ConsDecl { (:[]) $1 } + | ConsDecl ';' ListConsDecl { (:) $1 $3 } + + +ListPattern :: { [Pattern] } +ListPattern : {- empty -} { [] } + | ListPattern Pattern { flip (:) $1 $2 } + + +Pattern :: { Pattern } +Pattern : '(' CIdent ListPattern ')' { PCons $2 (reverse $3) } + | PatternVariable { PVar $1 } + | '{' ListFieldPattern '}' { PRec $2 } + | 'Type' { PType } + | String { PStr $1 } + | Integer { PInt $1 } + + +FieldPattern :: { FieldPattern } +FieldPattern : CIdent '=' Pattern { FieldPattern $1 $3 } + + +ListFieldPattern :: { [FieldPattern] } +ListFieldPattern : {- empty -} { [] } + | FieldPattern { (:[]) $1 } + | FieldPattern ';' ListFieldPattern { (:) $1 $3 } + + +PatternVariable :: { PatternVariable } +PatternVariable : CIdent { PVVar $1 } + | '_' { PVWild } + + +Exp :: { Exp } +Exp : 'let' '{' ListLetDef '}' 'in' Exp { ELet $3 $6 } + | 'case' Exp 'of' '{' ListCase '}' { ECase $2 $5 } + | Exp1 { $1 } + + +LetDef :: { LetDef } +LetDef : CIdent ':' Exp '=' Exp { LetDef $1 $3 $5 } + + +ListLetDef :: { [LetDef] } +ListLetDef : {- empty -} { [] } + | LetDef { (:[]) $1 } + | LetDef ';' ListLetDef { (:) $1 $3 } + + +Exp2 :: { Exp } +Exp2 : '\\' PatternVariable '->' Exp { EAbs $2 $4 } + | '(' PatternVariable ':' Exp ')' '->' Exp { EPi $2 $4 $7 } + | Exp3 { $1 } + + +Exp3 :: { Exp } +Exp3 : Exp3 Exp4 { EApp $1 $2 } + | Exp4 { $1 } + + +Exp4 :: { Exp } +Exp4 : Exp4 '.' CIdent { EProj $1 $3 } + | Exp5 { $1 } + + +Exp5 :: { Exp } +Exp5 : '{' '}' { EEmptyRec } + | '{' ListFieldType '}' { ERecType $2 } + | '{' ListFieldValue '}' { ERec $2 } + | CIdent { EVar $1 } + | 'Type' { EType } + | String { EStr $1 } + | Integer { EInt $1 } + | '(' Exp ')' { $2 } + + +Exp1 :: { Exp } +Exp1 : Exp2 { $1 } + + +Case :: { Case } +Case : Pattern '->' Exp { Case $1 $3 } + + +ListCase :: { [Case] } +ListCase : {- empty -} { [] } + | Case { (:[]) $1 } + | Case ';' ListCase { (:) $1 $3 } + + +FieldType :: { FieldType } +FieldType : CIdent ':' Exp { FieldType $1 $3 } + + +ListFieldType :: { [FieldType] } +ListFieldType : FieldType { (:[]) $1 } + | FieldType ';' ListFieldType { (:) $1 $3 } + + +FieldValue :: { FieldValue } +FieldValue : CIdent '=' Exp { FieldValue $1 $3 } + + +ListFieldValue :: { [FieldValue] } +ListFieldValue : FieldValue { (:[]) $1 } + | FieldValue ';' ListFieldValue { (:) $1 $3 } + + + +{ + +returnM :: a -> Err a +returnM = return + +thenM :: Err a -> (a -> Err b) -> Err b +thenM = (>>=) + +happyError :: [Token] -> Err a +happyError ts = + Bad $ "syntax error at " ++ tokenPos ts ++ if null ts then [] else (" before " ++ unwords (map prToken (take 4 ts))) + +myLexer = tokens +} + |
