eo-phi-normalizer-2.3.0: src/Language/EO/Phi/Syntax/Par.y
-- -*- haskell -*- File generated by the BNF Converter (bnfc 2.9.5).
-- Parser definition for use with Happy
{
{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
{-# LANGUAGE PatternSynonyms #-}
module Language.EO.Phi.Syntax.Par
( happyError
, myLexer
, pProgram
, pMetaId
, pObject
, pBinding
, pListBinding
, pAttribute
, pRuleAttribute
, pPeeledObject
, pObjectHead
, pObjectAction
, pListObjectAction
) where
import Prelude
import qualified Language.EO.Phi.Syntax.Abs
import Language.EO.Phi.Syntax.Lex
}
%name pProgram Program
%name pMetaId MetaId
%name pObject Object
%name pBinding Binding
%name pListBinding ListBinding
%name pAttribute Attribute
%name pRuleAttribute RuleAttribute
%name pPeeledObject PeeledObject
%name pObjectHead ObjectHead
%name pObjectAction ObjectAction
%name pListObjectAction ListObjectAction
-- no lexer declaration
%monad { Err } { (>>=) } { 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) }
'φ' { PT _ (TS _ 15) }
'↦' { PT _ (TS _ 16) }
'∅' { PT _ (TS _ 17) }
'⊥' { PT _ (TS _ 18) }
'⌈' { PT _ (TS _ 19) }
'⌉' { PT _ (TS _ 20) }
'⟦' { PT _ (TS _ 21) }
'⟧' { PT _ (TS _ 22) }
'⤍' { PT _ (TS _ 23) }
L_doubl { PT _ (TD $$) }
L_integ { PT _ (TI $$) }
L_quoted { PT _ (TL $$) }
L_Bytes { PT _ (T_Bytes $$) }
L_Function { PT _ (T_Function $$) }
L_LabelId { PT _ (T_LabelId $$) }
L_AlphaIndex { PT _ (T_AlphaIndex $$) }
L_LabelMetaId { PT _ (T_LabelMetaId $$) }
L_TailMetaId { PT _ (T_TailMetaId $$) }
L_BindingsMetaId { PT _ (T_BindingsMetaId $$) }
L_ObjectMetaId { PT _ (T_ObjectMetaId $$) }
L_BytesMetaId { PT _ (T_BytesMetaId $$) }
L_MetaFunctionName { PT _ (T_MetaFunctionName $$) }
%%
Double :: { Double }
Double : L_doubl { (read $1) :: Double }
Integer :: { Integer }
Integer : L_integ { (read $1) :: Integer }
String :: { String }
String : L_quoted { $1 }
Bytes :: { Language.EO.Phi.Syntax.Abs.Bytes }
Bytes : L_Bytes { Language.EO.Phi.Syntax.Abs.Bytes $1 }
Function :: { Language.EO.Phi.Syntax.Abs.Function }
Function : L_Function { Language.EO.Phi.Syntax.Abs.Function $1 }
LabelId :: { Language.EO.Phi.Syntax.Abs.LabelId }
LabelId : L_LabelId { Language.EO.Phi.Syntax.Abs.LabelId $1 }
AlphaIndex :: { Language.EO.Phi.Syntax.Abs.AlphaIndex }
AlphaIndex : L_AlphaIndex { Language.EO.Phi.Syntax.Abs.AlphaIndex $1 }
LabelMetaId :: { Language.EO.Phi.Syntax.Abs.LabelMetaId }
LabelMetaId : L_LabelMetaId { Language.EO.Phi.Syntax.Abs.LabelMetaId $1 }
TailMetaId :: { Language.EO.Phi.Syntax.Abs.TailMetaId }
TailMetaId : L_TailMetaId { Language.EO.Phi.Syntax.Abs.TailMetaId $1 }
BindingsMetaId :: { Language.EO.Phi.Syntax.Abs.BindingsMetaId }
BindingsMetaId : L_BindingsMetaId { Language.EO.Phi.Syntax.Abs.BindingsMetaId $1 }
ObjectMetaId :: { Language.EO.Phi.Syntax.Abs.ObjectMetaId }
ObjectMetaId : L_ObjectMetaId { Language.EO.Phi.Syntax.Abs.ObjectMetaId $1 }
BytesMetaId :: { Language.EO.Phi.Syntax.Abs.BytesMetaId }
BytesMetaId : L_BytesMetaId { Language.EO.Phi.Syntax.Abs.BytesMetaId $1 }
MetaFunctionName :: { Language.EO.Phi.Syntax.Abs.MetaFunctionName }
MetaFunctionName : L_MetaFunctionName { Language.EO.Phi.Syntax.Abs.MetaFunctionName $1 }
Program :: { Language.EO.Phi.Syntax.Abs.Program }
Program
: '{' '⟦' ListBinding '⟧' '}' { Language.EO.Phi.Syntax.Abs.Program $3 }
MetaId :: { Language.EO.Phi.Syntax.Abs.MetaId }
MetaId
: LabelMetaId { Language.EO.Phi.Syntax.Abs.MetaIdLabel $1 }
| TailMetaId { Language.EO.Phi.Syntax.Abs.MetaIdTail $1 }
| BindingsMetaId { Language.EO.Phi.Syntax.Abs.MetaIdBindings $1 }
| ObjectMetaId { Language.EO.Phi.Syntax.Abs.MetaIdObject $1 }
| BytesMetaId { Language.EO.Phi.Syntax.Abs.MetaIdBytes $1 }
Object :: { Language.EO.Phi.Syntax.Abs.Object }
Object
: '⟦' ListBinding '⟧' { Language.EO.Phi.Syntax.Abs.Formation $2 }
| Object '(' ListBinding ')' { Language.EO.Phi.Syntax.Abs.Application $1 $3 }
| Object '.' Attribute { Language.EO.Phi.Syntax.Abs.ObjectDispatch $1 $3 }
| 'Φ' { Language.EO.Phi.Syntax.Abs.GlobalObject }
| 'ξ' { Language.EO.Phi.Syntax.Abs.ThisObject }
| '⊥' { Language.EO.Phi.Syntax.Abs.Termination }
| String { Language.EO.Phi.Syntax.Abs.ConstString $1 }
| Integer { Language.EO.Phi.Syntax.Abs.ConstInt $1 }
| Double { Language.EO.Phi.Syntax.Abs.ConstFloat $1 }
| Object '[' 'ξ' '↦' Object ']' { Language.EO.Phi.Syntax.Abs.MetaSubstThis $1 $5 }
| '⌈' Object ',' Object '⌉' { Language.EO.Phi.Syntax.Abs.MetaContextualize $2 $4 }
| ObjectMetaId { Language.EO.Phi.Syntax.Abs.MetaObject $1 }
| Object '*' TailMetaId { Language.EO.Phi.Syntax.Abs.MetaTailContext $1 $3 }
| MetaFunctionName '(' Object ')' { Language.EO.Phi.Syntax.Abs.MetaFunction $1 $3 }
Binding :: { Language.EO.Phi.Syntax.Abs.Binding }
Binding
: Attribute '↦' Object { Language.EO.Phi.Syntax.Abs.AlphaBinding $1 $3 }
| Attribute '↦' '∅' { Language.EO.Phi.Syntax.Abs.EmptyBinding $1 }
| 'Δ' '⤍' Bytes { Language.EO.Phi.Syntax.Abs.DeltaBinding $3 }
| 'Δ' '⤍' '∅' { Language.EO.Phi.Syntax.Abs.DeltaEmptyBinding }
| 'λ' '⤍' Function { Language.EO.Phi.Syntax.Abs.LambdaBinding $3 }
| BindingsMetaId { Language.EO.Phi.Syntax.Abs.MetaBindings $1 }
| 'Δ' '⤍' BytesMetaId { Language.EO.Phi.Syntax.Abs.MetaDeltaBinding $3 }
ListBinding :: { [Language.EO.Phi.Syntax.Abs.Binding] }
ListBinding
: {- empty -} { [] }
| Binding { (:[]) $1 }
| Binding ',' ListBinding { (:) $1 $3 }
Attribute :: { Language.EO.Phi.Syntax.Abs.Attribute }
Attribute
: 'φ' { Language.EO.Phi.Syntax.Abs.Phi }
| 'ρ' { Language.EO.Phi.Syntax.Abs.Rho }
| LabelId { Language.EO.Phi.Syntax.Abs.Label $1 }
| AlphaIndex { Language.EO.Phi.Syntax.Abs.Alpha $1 }
| LabelMetaId { Language.EO.Phi.Syntax.Abs.MetaAttr $1 }
RuleAttribute :: { Language.EO.Phi.Syntax.Abs.RuleAttribute }
RuleAttribute
: Attribute { Language.EO.Phi.Syntax.Abs.ObjectAttr $1 }
| 'Δ' { Language.EO.Phi.Syntax.Abs.DeltaAttr }
| 'λ' { Language.EO.Phi.Syntax.Abs.LambdaAttr }
PeeledObject :: { Language.EO.Phi.Syntax.Abs.PeeledObject }
PeeledObject
: ObjectHead ListObjectAction { Language.EO.Phi.Syntax.Abs.PeeledObject $1 $2 }
ObjectHead :: { Language.EO.Phi.Syntax.Abs.ObjectHead }
ObjectHead
: '⟦' ListBinding '⟧' { Language.EO.Phi.Syntax.Abs.HeadFormation $2 }
| 'Φ' { Language.EO.Phi.Syntax.Abs.HeadGlobal }
| 'ξ' { Language.EO.Phi.Syntax.Abs.HeadThis }
| '⊥' { Language.EO.Phi.Syntax.Abs.HeadTermination }
ObjectAction :: { Language.EO.Phi.Syntax.Abs.ObjectAction }
ObjectAction
: '(' ListBinding ')' { Language.EO.Phi.Syntax.Abs.ActionApplication $2 }
| '.' Attribute { Language.EO.Phi.Syntax.Abs.ActionDispatch $2 }
ListObjectAction :: { [Language.EO.Phi.Syntax.Abs.ObjectAction] }
ListObjectAction
: {- empty -} { [] } | ObjectAction ListObjectAction { (:) $1 $2 }
{
type Err = Either String
happyError :: [Token] -> Err a
happyError ts = Left $
"syntax error at " ++ tokenPos ts ++
case ts of
[] -> []
[Err _] -> " due to lexer error"
t:_ -> " before `" ++ (prToken t) ++ "'"
myLexer :: String -> [Token]
myLexer = tokens
}