{ module HylotabParse where import HylotabLex import Form } %name parse %tokentype { Token } %token at1 { TokenAt1 } at2 { TokenAt2 } prop { TokenProp $$ } cst { TokenCst $$ } var { TokenVar $$ } true { TokenTrue } false { TokenFalse } neg { TokenNeg } and { TokenAnd } conj { TokenConj } or { TokenOr } disj { TokenDisj } dimp { TokenDimp } impl { TokenImpl } a { TokenA } e { TokenE } box { TokenBox $$ } cbox { TokenCbox $$ } dia { TokenDia $$ } cdia { TokenCdia $$ } bnd { TokenBnd } '(' { TokenOB } ')' { TokenCB } ',' { TokenComma } '.' { TokenDot } %right impl %right dimp %left or %left and %left box cbox dia cdia neg %% Form : cst { Nom (C (read $1)) } | var { Nom (V (read $1)) } | prop { Prop (read $1) } | true { Bool True } | false { Bool False } | a Form { A $2 } | e Form { E $2 } | dia Form { Dia (read $1) $2 } | cdia Form { Cdia (read $1) $2 } | box Form { Box (read $1) $2 } | cbox Form { Cbox (read $1) $2 } | '(' Form dimp Form ')' { Conj [Impl $2 $4,Impl $4 $2] } | '(' Form impl Form ')' { Impl $2 $4 } | neg Form { Neg $2 } | '(' Form and Form ')' { Conj (flattenConj [$2,$4]) } | '(' Form or Form ')' { Disj (flattenDisj [$2,$4]) } | cst at1 Form { At (C (read $1)) $3 } | var at1 Form { At (V (read $1)) $3 } | at2 cst Form { At (C (read $2)) $3 } | at2 var Form { At (V (read $2)) $3 } | bnd var Form { Down (read $2) $3 } | bnd var '.' Form { Down (read $2) $4 } | conj '(' ')' { Bool True } | conj '(' Forms ')' { Conj (reverse $3) } | disj '(' ')' { Bool False } | disj '(' Forms ')' { Disj (reverse $3) } | '(' Form ')' { $2 } Forms : Form { [$1] } | Forms ',' Form { $3 : $1 } { happyError :: [Token] -> a happyError _ = error "Parse error" }