module Casl-BasicItems
%% written/changed by Bjarke Wedemeijer (January 1998)
%% adapted by Mark van den Brand (Juni 1999)
%% adapted by Mark van den Brand (November 2000)
%% adapted by Christian Maeder (January 2002)
%% adapted by Christian Maeder (February 2004)
imports Casl-Lexical
exports
sorts
Basic-Spec Sort-S Op-S Pred-S Op-Type Pred-Type
lexical syntax
"."|[\183] -> Dot
context-free syntax
%% Basic-Items section
"{" "}" -> Basic-Spec
Ann Basic-Item+ -> Basic-Spec
Sig-Items -> Basic-Item
"free" Data-Item -> Basic-Item
"generated" Data-Item -> Basic-Item
"generated" "{" Sig-Items+ "}" Opt-Semi -> Basic-Item
Var-S {Var-Decl ";"}+ Opt-Semi -> Basic-Item
"forall" {Var-Decl ";"}+ Ann Dot-Item -> Basic-Item
Dot Ann Formula Opt-Semi -> Basic-Item
Dot Ann {Formula (Ann Dot)}+ Opt-Semi -> Dot-Item
%% old style
Axiom-S Ann {Formula (";" Ann)}+ Opt-Semi -> Basic-Item
%% Sig-Items
Sort-S Ann {Sort-Item (";" Ann)}+ Opt-Semi -> Sig-Items
Op-S Ann {Op-Item (";" Ann)}+ Opt-Semi -> Sig-Items
Pred-S Ann {Pred-Item (";" Ann)}+ Opt-Semi -> Sig-Items
Data-Item -> Sig-Items
%% Data-Item (abbreviation)
Datatype-S Ann {Datatype-Decl (";" Ann)}+ Opt-Semi -> Data-Item
%% Sort-Item
{Sort ","}+ -> Sort-Item
{Sort ","}+ "<" Sort -> Sort-Item
Sort "=" "{" Var ":" Sort Dot Formula "}" -> Sort-Item
Sort "=" {Sort "="}+ -> Sort-Item
%% Op-Item
{Op-Name ","}+ ":" Op-Type -> Op-Item
{Op-Name ","}+ ":" Op-Type "," {Op-Attr ","}+ -> Op-Item
Op-Name Op-Head "=" Term -> Op-Item
%% Op-Type
Some-Sorts "->" Sort -> Op-Type
Sort -> Op-Type
Some-Sorts "->?" Sort -> Op-Type
"?" Sort -> Op-Type
%% Sorts
{Sort "*"|[\215]}+ -> Some-Sorts
%% Op-Attr
"assoc" -> Op-Attr
"comm" -> Op-Attr
"idem" -> Op-Attr
"unit" Term -> Op-Attr
%% Op-Head
"(" {Arg-Decl ";"}+ ")" ":" Sort -> Op-Head
":" Sort -> Op-Head
"(" {Arg-Decl ";"}+ ")" ":" "?" Sort -> Op-Head
":" "?" Sort -> Op-Head
%% Arg-Decl
{Var ","}+ ":" Sort -> Arg-Decl
%% Pred-Item
{Pred-Name ","}+ ":" Pred-Type -> Pred-Item
Pred-Name Pred-Head "<=>" Formula -> Pred-Item
Pred-Name "<=>" Formula -> Pred-Item
%% Pred-Type
Some-Sorts -> Pred-Type
"(" ")" -> Pred-Type
%% Pred-Head
"(" {Arg-Decl ";"}+ ")" -> Pred-Head
%% Datatype-Decl
Sort "::=" Ann {Alternative ("|" Ann)}+ -> Datatype-Decl
%% Alternative
Op-Name"(" {Component ";"}+ ")" -> Alternative
Op-Name"(" {Component ";"}+ ")" "?" -> Alternative
Op-Name -> Alternative
Sort-S {Sort ","}+ -> Alternative
%% Component
{Op-Name ","}+ ":" Sort -> Component
{Op-Name ","}+ ":" "?" Sort -> Component
Sort -> Component
%% Var-Decl
{Var ","}+ ":" Sort -> Var-Decl
%% Var-S
"var" -> Var-S
"vars" -> Var-S
%% Axiom-S
"axiom" -> Axiom-S
"axioms" -> Axiom-S
%% Sort-S
"sort" -> Sort-S
"sorts" -> Sort-S
%% Op-S
"op" -> Op-S
"ops" -> Op-S
%% Pred-S
"pred" -> Pred-S
"preds" -> Pred-S
%% Datatype-S
"type" -> Datatype-S
"types" -> Datatype-S
%% Opt-Semi
";"? Ann -> Opt-Semi
%% Formula
Quantifier {Var-Decl ";"}+ Dot Formula -> Formula-Quant
Formula-Quant -> Formula
Formula-2 "<=>" Formula-2 -> Formula-1
Formula-2 "<=>" Formula-Quant -> Formula-1
Formula-2 -> Formula-1
Formula-1 -> Formula
Formula-3 "=>" Formula-3 -> Formula-2a
Formula-3 "=>" Formula-2a -> Formula-2a
Formula-3 "=>" Formula-Quant -> Formula-1
Formula-3 "if" Formula-3 -> Formula-2b
Formula-2b "if" Formula-3 -> Formula-2b
Formula-2b "if" Formula-Quant -> Formula-1
Formula-3 "if" Formula-Quant -> Formula-1
Formula-2a -> Formula-2
Formula-2b -> Formula-2
Formula-3 -> Formula-2
Formula-4 "/\\" Formula-4 -> Formula-3a
Formula-3a "/\\" Formula-4 -> Formula-3a
Formula-3a "/\\" Formula-Quant -> Formula-1
Formula-3 "/\\" Formula-Quant -> Formula-1
Formula-4 "\\/" Formula-4 -> Formula-3b
Formula-3b "\\/" Formula-4 -> Formula-3b
Formula-3b "\\/" Formula-Quant -> Formula-1
Formula-4 "\\/" Formula-Quant -> Formula-1
Formula-4 -> Formula-3
Formula-3a -> Formula-3
Formula-3b -> Formula-3
"not"|[\172] Formula-4 -> Formula-4
"not"|[\172] Formula-Quant -> Formula-Quant
"(" Formula ")" -> Formula-5
Formula-5 -> Formula-4
Atom -> Formula-5
"true" -> Atom
"false" -> Atom
"def" Term -> Atom
Term "=e="|"=" Term -> Atom
Term "in" Sort -> Atom
Term -> Atom
%% Quantifier
"forall" -> Quantifier
"exists" -> Quantifier
"exists" "!" -> Quantifier
%% Terms
{Term ","}+ -> Terms
%% Term
MixFix+ -> Term
Term "when" Formula "else" Term -> Term {right}
%% MixFix
Token -> MixFix
Literal -> MixFix
Place -> MixFix
QualPredName -> MixFix
QualVarName -> MixFix
QualOpName -> MixFix
MixFix ":"|"as" Sort -> MixFix
"(" Terms ")" -> MixFix
"[" Terms? "]" -> MixFix
"{" Terms? "}" -> MixFix
%% QualPredName
"(" "pred" Pred-Name ":" Pred-Type ")" -> QualPredName
%% QualVarName
"(" "var" Var ":" Sort ")" -> QualVarName
%% QualOpName
"(" "op" Op-Name ":" Op-Type ")" -> QualOpName
%% Various small definitions
Sort-Id -> Sort
Id -> Op-Name
Id -> Pred-Name
Simple-Id -> Var
context-free priorities
MixFix+ -> Term >
Term "when" Formula "else" Term -> Term