110 lines
4.1 KiB
Plaintext
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
|
|
}
|
|
|