packages feed

language-sygus-0.1.0.0: src/Sygus/ParseSygus.y

{
module Sygus.ParseSygus ( module Sygus.Syntax 
                        , parse ) where

import Sygus.LexSygus
import Sygus.Syntax
}

%name parse
%tokentype { Token }
%error { parseError }

%token
    num                 { TLit (LitNum $$) }
    bool                { TLit (LitBool $$) }
    other_lit           { TLit $$ }
    '_'                 { TUnderscore }
    '('                 { TOpenBracket }
    ')'                 { TCloseBracket }
    ':'                 { TColon }

    -- terms
    exists              { TSymbol "exists" }
    forall              { TSymbol "forall" }
    tlet                { TSymbol "let" }

    -- features
    grammars            { TSymbol "grammars" }
    fwdDecls            { TSymbol "fwd-decls" }
    recursion           { TSymbol "recursion" }

    -- cmds 
    checkSynth          { TSymbol "check-synth" }
    constraint          { TSymbol "constraint" }
    declareVar          { TSymbol "declare-var" }
    invConstraint       { TSymbol "inv-constraint" }
    setFeature          { TSymbol "set-feature" }
    synthFun            { TSymbol "synth-fun" }
    synthInv            { TSymbol "synth-inv" }

    -- smt cmds
    declareDatatype     { TSymbol "declare-datatype" }
    declareDatatypes    { TSymbol "declare-datatypes" }
    declareSort         { TSymbol "declare-sort" }
    defineFun           { TSymbol "define-fun" }
    defineSort          { TSymbol "define-sort" }
    setLogic            { TSymbol "set-logic" }
    setOption           { TSymbol "set-option" }

    -- gterm
    constant            { TSymbol "Constant" }
    variable            { TSymbol "Variable" }

    symb                { TSymbol $$ }
%%

sygus :: { [Cmd] }
       : sygus_rev { reverse $1 }

sygus_rev :: { [Cmd] }
           : sygus_rev cmd { $2:$1 }
           | {- empty -}   { [] }

cmd :: { Cmd }
     : '(' checkSynth ')'                                               { CheckSynth }
     | '(' constraint term ')'                                          { Constraint $3 }
     | '(' declareVar symb sort ')'                                     { DeclareVar $3 $4 }
     | '(' invConstraint symb symb symb symb ')'                        { InvConstraint $3 $4 $5 $6 }
     | '(' setFeature ':' feature bool ')'                              { SetFeature $4 $5 }
     | '(' synthFun symb '(' sorted_vars ')' sort maybe_grammar_def ')' { SynthFun $3 $5 $7 $8 }
     | '(' synthInv symb '(' sorted_vars ')' maybe_grammar_def  ')'     { SynthInv $3 $5 $7 }
     | smtCmd                                                           { SmtCmd $1 } 

lit :: { Lit }
     : num       { LitNum $1 }
     | bool      { LitBool $1}
     | other_lit { $1 }

identifier :: { Identifier }
            : symb                      { ISymb $1 }
            | '(' '_' symb indexes1 ')' { Indexed $3 $4 }

indexes1 :: { [Index] }
          : indexes_rev1 { reverse $1 }

indexes_rev1 :: { [Index] }
              : indexes_rev1 index { $2:$1 }
              | index              { [$1] }

index :: { Index }
       : num  {IndNumeral $1 }
       | symb {IndSymb $1 }

sorts1 :: { [Sort] }
          : sorts_rev1 { reverse $1 }

sorts_rev1 :: { [Sort] }
            : sorts_rev1 sort { $2:$1 }
            | sort            { [$1] }

sort :: { Sort }
      : identifier                { IdentSort $1 }
      | '(' identifier sorts1 ')' { IdentSortSort $2 $3 }

terms1 :: { [Term] }
        : terms_rev1 { reverse $1 }

terms_rev1 :: { [Term] }
            : terms_rev1 term { $2:$1 }
            | term           { [$1] }

term :: { Term }
      : identifier                               { TermIdent $1 }
      | lit                                      { TermLit $1 }
      | '(' identifier terms1 ')'                { TermCall $2 $3}
      | '(' exists '(' sorted_vars1 ')' term ')' { TermExists $4 $6 }
      | '(' forall '(' sorted_vars1 ')' term ')' { TermForAll $4 $6 }
      | '(' tlet '(' var_bindings1 ')' term ')'  { TermLet $4 $6 }

bfterms1 :: { [BfTerm] }
          : bfterms_rev1 { reverse $1 }

bfterms_rev1 :: { [BfTerm] }
              : bfterms_rev1 bfterm { $2:$1 }
              | bfterm              { [$1] }

bfterm :: { BfTerm }
        : identifier { BfIdentifier $1 }
        | lit        { BfLiteral $1 }
        | '(' identifier bfterms1 ')' { BfIdentifierBfs $2 $3 }

sorted_vars1 :: { [SortedVar] }
             : sorted_vars_rev1 { reverse $1 }

sorted_vars_rev1 :: { [SortedVar] }
            : sorted_vars_rev1 sorted_var { $2:$1 }
            | sorted_var                 { [$1] }

sorted_vars :: { [SortedVar] }
             : sorted_vars_rev { reverse $1 }

sorted_vars_rev :: { [SortedVar] }
            : sorted_vars_rev sorted_var { $2:$1 }
            | {- empty -}                 { [] }

sorted_var :: { SortedVar }
            : '(' symb sort ')' { SortedVar $2 $3 }

var_bindings1 :: { [VarBinding] }
               : var_bindings_rev1 { reverse $1 }

var_bindings_rev1 :: { [VarBinding] }
            : var_bindings_rev1 var_binding { $2:$1 }
            | var_binding                   { [$1] }

var_binding :: { VarBinding }
             : '(' symb term ')' { VarBinding $2 $3 }

feature :: { Feature }
         : grammars   { Grammars }
         | fwdDecls   { FwdDecls }
         | recursion  { Recursion }

smtCmd :: { SmtCmd }
        : '(' declareDatatype symb dt_dec ')'                           { DeclareDatatype $3 $4 }
        | '(' declareDatatypes '(' sort_decls1 ')' '(' dt_decs1 ')' ')' { DeclareDatatypes $4 $7 }
        | '(' declareSort symb num ')'                                  { DeclareSort $3 $4 }
        | '(' defineFun symb '(' sorted_vars ')' sort term ')'          { DefineFun $3 $5 $7 $8 }
        | '(' defineSort symb sort ')'                                  { DefineSort $3 $4 }
        | '(' setLogic symb ')'                                         { SetLogic $3 }
        | '(' setOption ':' symb lit ')'                                { SetOption $4 $5 }

sort_decls1 :: { [SortDecl] }
             : sort_decls_rev1 { reverse $1 }

sort_decls_rev1 :: { [SortDecl] }
                 : sort_decls_rev1 sort_decl   { $2:$1 }
                 | sort_decl                   { [$1] }

sort_decl :: { SortDecl }
           : '(' symb num ')' { SortDecl $2 $3 }

dt_decs1 :: { [DTDec] }
          : dt_decs_rev1 { reverse $1 }

dt_decs_rev1 :: { [DTDec] }
              : dt_decs_rev1 dt_dec { $2:$1 }
              | dt_dec              { [$1] }

dt_dec :: { DTDec }
        : '(' dt_cons_decs1 ')' { DTDec $2 }

dt_cons_decs1 :: { [DTConsDec] }
               : dt_cons_decs_rev1 { reverse $1 }

dt_cons_decs_rev1 :: { [DTConsDec] }
                   : dt_cons_decs_rev1 dt_cons_dec { $2:$1 }
                   | dt_cons_dec                   { [$1] }

dt_cons_dec :: { DTConsDec }
             : '(' symb sorted_vars ')' { DTConsDec $2 $3 }

maybe_grammar_def :: { Maybe GrammarDef }
                   : grammar_def { Just $1 }
                   | {- empty -} { Nothing }

grammar_def :: { GrammarDef }
             : '(' sorted_vars1 ')' '(' grouped_rule_lists1 ')' { GrammarDef $2 $5 }

grouped_rule_lists1 :: { [GroupedRuleList] }
                    : grouped_rule_lists_rev1 { reverse $1 }

grouped_rule_lists_rev1 :: { [GroupedRuleList] }
                        : grouped_rule_lists_rev1 grouped_rule_list { $2:$1 }
                        | grouped_rule_list                     { [$1] }

grouped_rule_list :: { GroupedRuleList }
                   : '(' symb sort '(' gterm1 ')' ')' { GroupedRuleList $2 $3 $5 }

gterm1 :: { [GTerm] }
        : gterm_rev1 { reverse $1 }

gterm_rev1 :: { [GTerm] }
            : gterm_rev1 gterm { $2:$1 }
            | gterm            { [$1] }

gterm :: { GTerm }
       : constant sort { GConstant $2 }
       | variable sort { GVariable $2 }
       | bfterm        { GBfTerm $1 }

{
parseError :: [Token] -> a
parseError l = error $ "Parse error." ++ show l
}