packages feed

liquid-fixpoint-0.1.0.0: external/fixpoint/hornParse.mly

%{
module A  = Ast
module So = A.Sort
module Sy = A.Symbol
module E  = A.Expression
module P  = A.Predicate
module H  = A.Horn
module Su = A.Subst
module C  = FixConstraint

let parse_error msg =
  Errorline.error (symbol_start ()) msg

%}

%token <string> Var
%token <string> Id
%token <int> Num
%token BEXP
%token TRUE FALSE
%token LPAREN  RPAREN LB RB LC RC
%token EQ NE GT GE LT LE
%token AND OR NOT IMPL FORALL SEMI COMMA COLON DOT
%token EOF
%token PLUS
%token MINUS
%token TIMES 
%token DIV
%token HC 

%right PLUS 
%right MINUS
%right TIMES 
%right DIV 


%start horns 

%type <A.pred list>                          preds, predsne
%type <A.pred>                               pred
%type <A.expr list>                          exprs, exprsne
%type <A.expr>                               expr
%type <A.brel>                               brel 
%type <A.bop>                                bop 

%type <H.pr>                                 pr
%type <H.gd>                                 guard
%type <H.gd list>                            guards, guardsne
%type <Ast.Horn.t>                           hc
%type <Ast.Horn.t list>                      horns 

%%
preds:
    LB RB                               { [] }
  | LB predsne RB                       { $2 }
  ;

predsne:
    pred                                { [$1] }
  | pred SEMI predsne                   { $1 :: $3 }
;

pred:
    TRUE				{ A.pTrue }
  | FALSE				{ A.pFalse }
  | BEXP expr                           { A.pBexp $2 }
  | AND preds   			{ A.pAnd ($2) }
  | OR  preds 	        		{ A.pOr  ($2) }
  | NOT pred				{ A.pNot ($2) }
  | pred IMPL pred			{ A.pImp ($1, $3) }
  | expr brel expr                      { A.pAtom ($1, $2, $3) }
  | LPAREN pred RPAREN			{ $2 }
  ;

exprs:
    LB RB                               { [] }
  | LB exprsne RB                       { $2 }
  ;

exprsne:
    expr                                { [$1] }
  | expr SEMI exprsne                   { $1 :: $3 }
  ;

expr:
    Id				        { A.eVar (Sy.of_string $1) }
  | Num 				{ A.eCon (A.Constant.Int $1) }
  | MINUS Num 				{ A.eCon (A.Constant.Int (-1 * $2)) }
  | MINUS LPAREN expr RPAREN 	        { A.eBin (A.zero, A.Minus, $3) }
  | expr bop expr                       { A.eBin ($1, $2, $3) }
  | Id LPAREN  exprs RPAREN             { A.eApp ((Sy.of_string $1), $3) }
  | LPAREN expr RPAREN                  { $2 }
  ;

brel:
    EQ                                  { A.Eq }
  | NE                                  { A.Ne }
  | GT                                  { A.Gt }
  | GE                                  { A.Ge }
  | LT                                  { A.Lt }
  | LE                                  { A.Le }
  ;

bop:
    PLUS                                { A.Plus }
  | MINUS                               { A.Minus }
  | TIMES                               { A.Times }
  | DIV                                 { A.Div }
  ;


idsne:
    Id                                  { [$1] }
  | Id COMMA idsne                      { $1 :: $3 }
  ;

pr: 
    Var LPAREN RPAREN                    { ($1, []) }
  | Var LPAREN idsne RPAREN              { ($1, $3) }
  | Var                                  { ($1, []) }
  ;

guard:
    pr                                  { H.K ($1) }
  | pred                                { H.C ($1) }
  ;

guards:
    LB RB                               { [] }
  | LB guardsne RB                      { $2 }
  ;

guardsne:
    guard                               { [$1] }
  | guard COMMA guardsne                { $1 :: $3 }
  ;

hc: 
  HC LPAREN pr COMMA guards RPAREN DOT {($3, $5)}
  ;


horns:
                                        { [] }
  | hc horns                            { $1 :: $2 }