-- Copyright 2020 United States Government as represented by the Administrator
-- of the National Aeronautics and Space Administration. All Rights Reserved.
--
-- Disclaimers
--
-- No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
-- OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
-- LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
-- SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-- PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE
-- SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF
-- PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN
-- ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR
-- RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR
-- ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER,
-- GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING
-- THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES
-- IT "AS IS."
--
-- Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
-- THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS
-- ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
-- ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE,
-- INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
-- USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
-- UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY
-- PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY
-- FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS
-- AGREEMENT.
-- This is a simplified grammar of SMV temporal logic expressions, extended
-- with the tags that FRET uses around names.
--
-- The format of FRET files itself uses JSON, so this grammar applies
-- only to specific fields in those files.
entrypoints BoolSpec;
BoolSpecSignal. BoolSpec9 ::= Ident;
BoolSpecConst. BoolSpec9 ::= BoolConst ;
BoolSpecNum. BoolSpec9 ::= NumExpr;
BoolSpecCmp. BoolSpec8 ::= BoolSpec8 OrdOp BoolSpec9;
BoolSpecNeg. BoolSpec7 ::= "!" BoolSpec8;
BoolSpecAnd. BoolSpec6 ::= BoolSpec6 "&" BoolSpec7;
BoolSpecOr. BoolSpec5 ::= BoolSpec5 "|" BoolSpec6;
BoolSpecXor. BoolSpec4 ::= BoolSpec4 "xor" BoolSpec5;
BoolSpecImplies. BoolSpec3 ::= BoolSpec3 "->" BoolSpec4;
BoolSpecEquivs. BoolSpec2 ::= BoolSpec2 "<->" BoolSpec3;
BoolSpecOp1. BoolSpec1 ::= OpOne BoolSpec2;
BoolSpecOp2. BoolSpec ::= BoolSpec OpTwo BoolSpec1;
_ . BoolSpec9 ::= "(" BoolSpec ")";
_ . BoolSpec9 ::= "" BoolSpec "";
_ . BoolSpec9 ::= "" BoolSpec "";
_ . BoolSpec8 ::= BoolSpec9 ;
_ . BoolSpec7 ::= BoolSpec8 ;
_ . BoolSpec6 ::= BoolSpec7 ;
_ . BoolSpec5 ::= BoolSpec6 ;
_ . BoolSpec4 ::= BoolSpec5 ;
_ . BoolSpec3 ::= BoolSpec4 ;
_ . BoolSpec2 ::= BoolSpec3 ;
_ . BoolSpec1 ::= BoolSpec2 ;
_ . BoolSpec ::= BoolSpec1 ;
NumId . NumExpr2 ::= Ident ;
NumConstI . NumExpr2 ::= Integer ;
NumConstD . NumExpr2 ::= Double;
NumAdd . NumExpr1 ::= NumExpr1 AdditiveOp NumExpr2;
NumMult . NumExpr ::= NumExpr MultOp NumExpr1;
_ . NumExpr2 ::= "(" NumExpr ")" ;
_ . NumExpr1 ::= NumExpr2 ;
_ . NumExpr ::= NumExpr1;
OpPlus . AdditiveOp ::= "+" ;
OpMinus . AdditiveOp ::= "-" ;
OpTimes . MultOp ::= "*" ;
OpDiv . MultOp ::= "/" ;
BoolConstTrue. BoolConst ::= "TRUE";
BoolConstFalse. BoolConst ::= "FALSE";
BoolConstFTP. BoolConst ::= "FTP";
BoolConstLAST. BoolConst ::= "LAST";
Op1Alone . OpOne ::= Op1Name;
Op1MTL. OpOne ::= Op1Name "[" OrdOp Number "]";
Op1MTLRange. OpOne ::= Op1Name "[" Number "," Number "]";
NumberInt . Number ::= Integer;
_ . Number ::= "" Number "";
_ . Number ::= "" Number "";
OrdOpLT . OrdOp ::= "<";
OrdOpLE . OrdOp ::= "<=";
OrdOpEQ . OrdOp ::= "=";
OrdOpNE . OrdOp ::= "!=";
OrdOpGT . OrdOp ::= ">";
OrdOpGE . OrdOp ::= ">=";
Op1Pre. Op1Name ::= "pre";
Op1X. Op1Name ::= "X";
Op1G. Op1Name ::= "G";
Op1F. Op1Name ::= "F";
Op1Y. Op1Name ::= "Y";
Op1Z. Op1Name ::= "Z";
Op1Hist. Op1Name ::= "H";
Op1O. Op1Name ::= "O";
Op2S. OpTwo ::= "S";
Op2T. OpTwo ::= "T";
Op2V. OpTwo ::= "V";
Op2U. OpTwo ::= "U";