From dbe8e61acc616b8f5ac07e8df89eb98a7997c29d Mon Sep 17 00:00:00 2001 From: bringert Date: Fri, 25 Nov 2005 16:36:19 +0000 Subject: Move transfer into the GF repo. --- src/Transfer/Syntax/Par.y | 268 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 src/Transfer/Syntax/Par.y (limited to 'src/Transfer/Syntax/Par.y') diff --git a/src/Transfer/Syntax/Par.y b/src/Transfer/Syntax/Par.y new file mode 100644 index 000000000..8453a3c61 --- /dev/null +++ b/src/Transfer/Syntax/Par.y @@ -0,0 +1,268 @@ +-- This Happy file was machine-generated by the BNF converter +{ +module Transfer.Syntax.Par where +import Transfer.Syntax.Abs +import Transfer.Syntax.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 "||") } + '&&' { 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") } + 'else' { PT _ (TS "else") } + 'if' { PT _ (TS "if") } + 'import' { PT _ (TS "import") } + 'in' { PT _ (TS "in") } + 'let' { PT _ (TS "let") } + 'of' { PT _ (TS "of") } + 'then' { PT _ (TS "then") } + 'where' { PT _ (TS "where") } + +L_ident { PT _ (TV $$) } +L_quoted { PT _ (TL $$) } +L_integ { PT _ (TI $$) } +L_err { _ } + + +%% + +Ident :: { Ident } : L_ident { Ident $1 } +String :: { String } : L_quoted { $1 } +Integer :: { Integer } : L_integ { (read $1) :: Integer } + +Module :: { Module } +Module : ListImport ListDecl { Module $1 $2 } + + +Import :: { Import } +Import : 'import' Ident { Import $2 } + + +ListImport :: { [Import] } +ListImport : {- empty -} { [] } + | Import { (:[]) $1 } + | Import ';' ListImport { (:) $1 $3 } + + +Decl :: { Decl } +Decl : 'data' Ident ':' Exp 'where' '{' ListConsDecl '}' { DataDecl $2 $4 $7 } + | Ident ':' Exp { TypeDecl $1 $3 } + | Ident ListPattern '=' Exp { ValueDecl $1 (reverse $2) $4 } + | 'derive' Ident Ident { DeriveDecl $2 $3 } + + +ListDecl :: { [Decl] } +ListDecl : {- empty -} { [] } + | Decl { (:[]) $1 } + | Decl ';' ListDecl { (:) $1 $3 } + + +ConsDecl :: { ConsDecl } +ConsDecl : Ident ':' Exp { ConsDecl $1 $3 } + + +ListConsDecl :: { [ConsDecl] } +ListConsDecl : {- empty -} { [] } + | ConsDecl { (:[]) $1 } + | ConsDecl ';' ListConsDecl { (:) $1 $3 } + + +Pattern :: { Pattern } +Pattern : Ident Pattern1 ListPattern { PConsTop $1 $2 (reverse $3) } + | Pattern1 { $1 } + + +Pattern1 :: { Pattern } +Pattern1 : '(' Ident ListPattern ')' { PCons $2 (reverse $3) } + | '{' ListFieldPattern '}' { PRec $2 } + | 'Type' { PType } + | String { PStr $1 } + | Integer { PInt $1 } + | Ident { PVar $1 } + | '_' { PWild } + + +ListPattern :: { [Pattern] } +ListPattern : {- empty -} { [] } + | ListPattern Pattern1 { flip (:) $1 $2 } + + +FieldPattern :: { FieldPattern } +FieldPattern : Ident '=' Pattern { FieldPattern $1 $3 } + + +ListFieldPattern :: { [FieldPattern] } +ListFieldPattern : {- empty -} { [] } + | FieldPattern { (:[]) $1 } + | FieldPattern ';' ListFieldPattern { (:) $1 $3 } + + +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 } + | Exp1 { $1 } + + +LetDef :: { LetDef } +LetDef : Ident ':' Exp '=' Exp { LetDef $1 $3 $5 } + + +ListLetDef :: { [LetDef] } +ListLetDef : {- empty -} { [] } + | LetDef { (:[]) $1 } + | LetDef ';' ListLetDef { (:) $1 $3 } + + +Case :: { Case } +Case : Pattern '->' Exp { Case $1 $3 } + + +ListCase :: { [Case] } +ListCase : {- empty -} { [] } + | Case { (:[]) $1 } + | Case ';' ListCase { (:) $1 $3 } + + +Exp2 :: { Exp } +Exp2 : '\\' VarOrWild '->' Exp { EAbs $2 $4 } + | '(' VarOrWild ':' Exp ')' '->' Exp { EPi $2 $4 $7 } + | Exp3 '->' Exp { EPiNoVar $1 $3 } + | Exp3 { $1 } + + +VarOrWild :: { VarOrWild } +VarOrWild : Ident { VVar $1 } + | '_' { VWild } + + +Exp3 :: { Exp } +Exp3 : Exp4 '||' Exp3 { EOr $1 $3 } + | Exp4 { $1 } + + +Exp4 :: { Exp } +Exp4 : Exp5 '&&' Exp4 { EAnd $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 } + | Exp6 { $1 } + + +Exp6 :: { Exp } +Exp6 : Exp6 '+' Exp7 { EAdd $1 $3 } + | Exp6 '-' Exp7 { ESub $1 $3 } + | Exp7 { $1 } + + +Exp7 :: { Exp } +Exp7 : Exp7 '*' Exp8 { EMul $1 $3 } + | Exp7 '/' Exp8 { EDiv $1 $3 } + | Exp7 '%' Exp8 { EMod $1 $3 } + | Exp8 { $1 } + + +Exp8 :: { Exp } +Exp8 : Exp8 '.' Ident { EProj $1 $3 } + | Exp9 { $1 } + + +Exp9 :: { Exp } +Exp9 : '-' Exp9 { ENeg $2 } + | Exp10 { $1 } + + +Exp10 :: { Exp } +Exp10 : Exp10 Exp11 { EApp $1 $2 } + | Exp11 { $1 } + + +Exp11 :: { Exp } +Exp11 : '{' '}' { EEmptyRec } + | '{' ListFieldType '}' { ERecType $2 } + | '{' ListFieldValue '}' { ERec $2 } + | Ident { EVar $1 } + | 'Type' { EType } + | String { EStr $1 } + | Integer { EInt $1 } + | '(' Exp ')' { $2 } + + +FieldType :: { FieldType } +FieldType : Ident ':' Exp { FieldType $1 $3 } + + +ListFieldType :: { [FieldType] } +ListFieldType : FieldType { (:[]) $1 } + | FieldType ';' ListFieldType { (:) $1 $3 } + + +FieldValue :: { FieldValue } +FieldValue : Ident '=' Exp { FieldValue $1 $3 } + + +ListFieldValue :: { [FieldValue] } +ListFieldValue : FieldValue { (:[]) $1 } + | FieldValue ';' ListFieldValue { (:) $1 $3 } + + +Exp1 :: { Exp } +Exp1 : Exp2 { $1 } + + + +{ + +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 +} + -- cgit v1.2.3