packages feed

cubical-0.2.0: Exp/Par.y

-- This Happy file was machine-generated by the BNF converter
{
{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
module Exp.Par where
import Exp.Abs
import Exp.Lex
import Exp.ErrM

}

%name pModule Module
%name pExp Exp

-- no lexer declaration
%monad { Err } { thenM } { returnM }
%tokentype { Token }

%token 
 '(' { PT _ (TS _ 1) }
 ')' { PT _ (TS _ 2) }
 '*' { PT _ (TS _ 3) }
 ',' { PT _ (TS _ 4) }
 '->' { PT _ (TS _ 5) }
 '.1' { PT _ (TS _ 6) }
 '.2' { PT _ (TS _ 7) }
 ':' { PT _ (TS _ 8) }
 ';' { PT _ (TS _ 9) }
 '=' { PT _ (TS _ 10) }
 'U' { PT _ (TS _ 11) }
 '\\' { PT _ (TS _ 12) }
 'data' { PT _ (TS _ 13) }
 'import' { PT _ (TS _ 14) }
 'in' { PT _ (TS _ 15) }
 'let' { PT _ (TS _ 16) }
 'module' { PT _ (TS _ 17) }
 'mutual' { PT _ (TS _ 18) }
 'opaque' { PT _ (TS _ 19) }
 'primitive' { PT _ (TS _ 20) }
 'split' { PT _ (TS _ 21) }
 'transparent' { PT _ (TS _ 22) }
 'where' { PT _ (TS _ 23) }
 '{' { PT _ (TS _ 24) }
 '|' { PT _ (TS _ 25) }
 '}' { PT _ (TS _ 26) }

L_AIdent { PT _ (T_AIdent _) }
L_err    { _ }


%%

AIdent    :: { AIdent} : L_AIdent { AIdent (mkPosToken $1)}

Module :: { Module }
Module : 'module' AIdent 'where' '{' ListImp ListDecl '}' { Module $2 $5 $6 } 


Imp :: { Imp }
Imp : 'import' AIdent { Import $2 } 


ListImp :: { [Imp] }
ListImp : {- empty -} { [] } 
  | Imp { (:[]) $1 }
  | Imp ';' ListImp { (:) $1 $3 }


Decl :: { Decl }
Decl : AIdent ListAIdent '=' ExpWhere { DeclDef $1 (reverse $2) $4 } 
  | AIdent ':' Exp { DeclType $1 $3 }
  | 'primitive' AIdent ':' Exp { DeclPrim $2 $4 }
  | 'data' AIdent ListAIdent '=' ListLabel { DeclData $2 (reverse $3) $5 }
  | 'mutual' '{' ListDecl '}' { DeclMutual $3 }
  | 'opaque' AIdent { DeclOpaque $2 }
  | 'transparent' AIdent { DeclTransp $2 }


ListDecl :: { [Decl] }
ListDecl : {- empty -} { [] } 
  | Decl { (:[]) $1 }
  | Decl ';' ListDecl { (:) $1 $3 }


ExpWhere :: { ExpWhere }
ExpWhere : Exp 'where' '{' ListDecl '}' { Where $1 $4 } 
  | Exp { NoWhere $1 }


Exp :: { Exp }
Exp : 'let' '{' ListDecl '}' 'in' Exp { Let $3 $6 } 
  | '\\' AIdent ListAIdent '->' Exp { Lam $2 (reverse $3) $5 }
  | 'split' '{' ListBranch '}' { Split $3 }
  | Exp1 { $1 }


Exp1 :: { Exp }
Exp1 : Exp2 '->' Exp1 { Fun $1 $3 } 
  | ListPseudoTDecl '->' Exp1 { Pi $1 $3 }
  | ListPseudoTDecl '*' Exp1 { Sigma $1 $3 }
  | Exp2 { $1 }


Exp2 :: { Exp }
Exp2 : Exp2 Exp3 { App $1 $2 } 
  | Exp3 { $1 }


Exp3 :: { Exp }
Exp3 : Exp3 '.1' { Fst $1 } 
  | Exp3 '.2' { Snd $1 }
  | '(' Exp ',' Exp ')' { Pair $2 $4 }
  | AIdent { Var $1 }
  | 'U' { U }
  | '(' Exp ')' { $2 }


Branch :: { Branch }
Branch : AIdent ListAIdent '->' ExpWhere { Branch $1 (reverse $2) $4 } 


ListBranch :: { [Branch] }
ListBranch : {- empty -} { [] } 
  | Branch { (:[]) $1 }
  | Branch ';' ListBranch { (:) $1 $3 }


Label :: { Label }
Label : AIdent ListVTDecl { Label $1 (reverse $2) } 


ListLabel :: { [Label] }
ListLabel : {- empty -} { [] } 
  | Label { (:[]) $1 }
  | Label '|' ListLabel { (:) $1 $3 }


VTDecl :: { VTDecl }
VTDecl : '(' AIdent ListAIdent ':' Exp ')' { VTDecl $2 (reverse $3) $5 } 


ListVTDecl :: { [VTDecl] }
ListVTDecl : {- empty -} { [] } 
  | ListVTDecl VTDecl { flip (:) $1 $2 }


PseudoTDecl :: { PseudoTDecl }
PseudoTDecl : '(' Exp ':' Exp ')' { PseudoTDecl $2 $4 } 


ListPseudoTDecl :: { [PseudoTDecl] }
ListPseudoTDecl : PseudoTDecl { (:[]) $1 } 
  | PseudoTDecl ListPseudoTDecl { (:) $1 $2 }


ListAIdent :: { [AIdent] }
ListAIdent : {- empty -} { [] } 
  | ListAIdent AIdent { flip (:) $1 $2 }



{

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 ++ 
  case ts of
    [] -> []
    [Err _] -> " due to lexer error"
    _ -> " before " ++ unwords (map (id . prToken) (take 4 ts))

myLexer = tokens
}