packages feed

hylolib-1.3.0: src/HyLo/InputFile/OldParser.y

{
{-# OPTIONS_GHC -w #-}
{-
Copyright (C) HyLoRes 2002-2007. See AUTHORS file

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
USA.
-}

module HyLo.InputFile.OldParser ( parse )

where

import HyLo.InputFile.OldLexer ( Token(..), FilePos, line, col )

import HyLo.Signature.Simple ( PropSymbol(..),
                               NomSymbol(..),
                               RelSymbol(..) )

-- since ghc 6.10, "Down" is defined in GHC.Exts, that is included
-- (unqualified) in the parser. we need to use Formula.Down instead of
-- simply Down to avoid ambiguities...
import HyLo.Formula as Formula ( Formula(..) )
}

%name parse
%tokentype { (Token, FilePos) }

%token
             begin           { (TokenBegin    , _) }
             end             { (TokenEnd      , _) }
             at              { (TokenAt       , _) }
             at2             { (TokenAt2      , _) }
             down            { (TokenDown     , _) }
             prop            { (TokenProp $$  , _) }
             nom             { (TokenNom $$   , _) }
             var             { (TokenVar $$   , _) }
             true            { (TokenTrue     , _) }
             false           { (TokenFalse    , _) }
             neg             { (TokenNeg      , _) }
             and             { (TokenAnd      , _) }
             or              { (TokenOr       , _) }
             dimp            { (TokenDimp     , _) }
             imp             { (TokenImp      , _) }
             box             { (TokenBox $$   , _) }
             ubox            { (TokenUBox     , _) }
             dbox            { (TokenDBox     , _) }
             dia             { (TokenDia $$   , _) }
             udia            { (TokenUDia     , _) }
             ddia            { (TokenDDia     , _) }
             '('             { (TokenOB       , _) }
             ')'             { (TokenCB       , _) }
             ';'             { (TokenSC       , _) }
             '.'             { (TokenDot      , _) }
%right imp
%right dimp
%left or
%left and
%left box ubox dbox dia udia ddia neg
%right down
%right at

%%

Input :: { [Formula NomSymbol PropSymbol RelSymbol] }
Input :
  begin Formulas end               { $2 }

Formulas :: { [Formula NomSymbol PropSymbol RelSymbol] }
Formulas :
  Formula                          { [$1] }
| Formula ';' Formulas             { $1:$3 }


Formula :: { Formula NomSymbol PropSymbol RelSymbol }
Formula :
  true                             { Top          }
| false                            { Bot          }
| var                              { Nom $1      }
| nom                              { Nom  $1      }
| prop                             { Prop $1      }
| dia    Formula                   { Diam $1 $2   }
| udia   Formula                   { E $2         }
| ddia   Formula                   { D $2         }
| box    Formula                   { Box $1 $2    }
| ubox Formula                     { A $2         }
| dbox   Formula                   { B $2         }
| Formula dimp Formula             { $1 :<-->: $3 }
| Formula imp Formula              { $1 :-->: $3  }
| neg Formula                      { Neg $2       }
| Formula and Formula              { $1 :&: $3    }
| Formula or Formula               { $1 :|: $3    }
| nom at Formula                   { At  $1 $3   }
| at2 nom Formula %prec at         { At  $2 $3   }
| var at Formula                   { At  $1 $3   }
| at2 var Formula %prec at         { At  $2 $3   }
| down '(' var  Formula ')'        { Formula.Down $3 $4   }
| down var '.' Formula %prec down  { Formula.Down $2 $4   }
| '(' Formula ')'                  { $2           }

{
happyError :: [(Token, FilePos)] -> a
happyError ((_, fp):_) = error ("Parse error near line " ++
                                   (show $ line fp) ++
                                   ", col. " ++
                                   (show $ col fp))
}