lang/src/Language/Lang/ParGrammer.y

110 lines
4.1 KiB
Plaintext

-- This Happy file was machine-generated by the BNF converter
{
{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
module Language.Lang.ParGrammer where
import qualified Language.Lang.AbsGrammer
import Language.Lang.LexGrammer
}
%name pModule Module
-- no lexer declaration
%monad { Either String } { (>>=) } { return }
%tokentype {Token}
%token
'#}' { PT _ (TS _ 1) }
'(' { PT _ (TS _ 2) }
')' { PT _ (TS _ 3) }
',' { PT _ (TS _ 4) }
'->' { PT _ (TS _ 5) }
':' { PT _ (TS _ 6) }
'=' { PT _ (TS _ 7) }
'[' { PT _ (TS _ 8) }
']' { PT _ (TS _ 9) }
'{' { PT _ (TS _ 10) }
'{#' { PT _ (TS _ 11) }
'{{' { PT _ (TS _ 12) }
'}' { PT _ (TS _ 13) }
'}}' { PT _ (TS _ 14) }
L_Name { PT _ (T_Name $$) }
L_NumericLiteral { PT _ (T_NumericLiteral $$) }
%%
Name :: { Language.Lang.AbsGrammer.Name}
Name : L_Name { Language.Lang.AbsGrammer.Name $1 }
NumericLiteral :: { Language.Lang.AbsGrammer.NumericLiteral}
NumericLiteral : L_NumericLiteral { Language.Lang.AbsGrammer.NumericLiteral $1 }
Module :: { Language.Lang.AbsGrammer.Module }
Module : ListBinding { Language.Lang.AbsGrammer.Module $1 }
Binding :: { Language.Lang.AbsGrammer.Binding }
Binding : Declaration { Language.Lang.AbsGrammer.BindingDeclaration $1 }
| Definition { Language.Lang.AbsGrammer.BindingDefinition $1 }
| '{#' Pragma '#}' { Language.Lang.AbsGrammer.BindingPragma $2 }
Declaration :: { Language.Lang.AbsGrammer.Declaration }
Declaration : Name ':' Type { Language.Lang.AbsGrammer.DeclarationNamed $1 $3 }
| Type { Language.Lang.AbsGrammer.DeclarationAnonymous $1 }
Definition :: { Language.Lang.AbsGrammer.Definition }
Definition : Name '=' Expression { Language.Lang.AbsGrammer.DefinitionNamed $1 $3 }
| Expression { Language.Lang.AbsGrammer.DefinitionAnonymous $1 }
Type :: { Language.Lang.AbsGrammer.Type }
Type : Name { Language.Lang.AbsGrammer.TypeName $1 }
| Type Type { Language.Lang.AbsGrammer.TypeApplication $1 $2 }
| Type '->' Type { Language.Lang.AbsGrammer.TypeAbstraction $1 $3 }
| '{{' ListDeclaration '}}' { Language.Lang.AbsGrammer.TypeImplicit $2 }
| '{' ListDeclaration '}' { Language.Lang.AbsGrammer.TypeRecord $2 }
| '[' ListDeclaration ']' { Language.Lang.AbsGrammer.TypeAlternative $2 }
| '(' Type ')' { Language.Lang.AbsGrammer.TypeParens $2 }
Pragma :: { Language.Lang.AbsGrammer.Pragma }
Pragma : ListName { Language.Lang.AbsGrammer.Pragma $1 }
ListBinding :: { [Language.Lang.AbsGrammer.Binding] }
ListBinding : {- empty -} { [] }
| Binding { (:[]) $1 }
| Binding ',' ListBinding { (:) $1 $3 }
ListDeclaration :: { [Language.Lang.AbsGrammer.Declaration] }
ListDeclaration : {- empty -} { [] }
| Declaration { (:[]) $1 }
| Declaration ',' ListDeclaration { (:) $1 $3 }
ListDefinition :: { [Language.Lang.AbsGrammer.Definition] }
ListDefinition : {- empty -} { [] }
| Definition { (:[]) $1 }
| Definition ',' ListDefinition { (:) $1 $3 }
ListType :: { [Language.Lang.AbsGrammer.Type] }
ListType : Type { (:[]) $1 } | Type ',' ListType { (:) $1 $3 }
ListName :: { [Language.Lang.AbsGrammer.Name] }
ListName : Name { (:[]) $1 } | Name ListName { (:) $1 $2 }
Expression :: { Language.Lang.AbsGrammer.Expression }
Expression : Name { Language.Lang.AbsGrammer.ExpressionName $1 }
| NumericLiteral { Language.Lang.AbsGrammer.ExpressionLiteral $1 }
| Expression Expression { Language.Lang.AbsGrammer.ExpressionApplication $1 $2 }
| Expression '->' Expression { Language.Lang.AbsGrammer.ExpressionAbstraction $1 $3 }
| '{{' Module '}}' { Language.Lang.AbsGrammer.ExpressionImplicit $2 }
| '{' Module '}' { Language.Lang.AbsGrammer.ExpressionRecord $2 }
| '[' Module ']' { Language.Lang.AbsGrammer.ExpressionAlternative $2 }
| '(' Expression ')' { Language.Lang.AbsGrammer.ExpressionParens $2 }
{
happyError :: [Token] -> Either String a
happyError ts = Left $
"syntax error at " ++ tokenPos ts ++
case ts of
[] -> []
[Err _] -> " due to lexer error"
t:_ -> " before `" ++ (prToken t) ++ "'"
myLexer = tokens
}