(* ========================================================================= *)
(* Some (mutually, nested) recursive types from various sources. *)
(* ========================================================================= *)
time define_type "Term = Var A B | App bool Termlist;
Termlist = Empty | Consp Term Termlist";;
time define_type "List = Nil | Cons A List";;
time define_type "Btree = Leaf A | Node B Btree Btree";;
time define_type "Command = Assign ind Expression
| If Expression Command
| Ite Expression Command Command
| While Expression Command
| Do Command Expression;
Expression = Constant num
| Variable ind
| Summ Expression Expression
| Product Expression Expression";;
time define_type "testa = empty_testa | cons_testa testa testb;
testb = contentb L testc;
testc = connection M testa";;
time define_type "atexp = Varb ind | Let dec exp;
exp = Exp1 atexp | Exp2 exp atexp | Exp3 matching;
matching = Match1 rule | Matches rule matching;
rule = Rule pat exp;
dec = Val valbind | Local dec dec | Decs dec dec;
valbind = Single pat exp | Multi pat exp valbind | Rec valbind;
pat = Wild | Varpat ind";;
time define_type "tri = ONE | TWO | THREE";;
(* ------------------------------------------------------------------------- *)
(* A couple from Steve Brackin's work. *)
(* ------------------------------------------------------------------------- *)
time define_type "T = X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 |
X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | X21 |
X22 | X23 | X24 | X25 | X26 | X27 | X28 | X29 | X30 | X31 |
X32 | X33 | X34";;
time define_type "TY1 = NoF__ | Fk__ A TY2;
TY2 = Ta__ bool | Td__ bool | Tf__ TY1 | Tk__ bool | Tp__ bool
| App__ A TY1 TY2 TY3 | Pair__ TY2 TY2;
TY3 = NoS__ | Fresh__ TY2 | Trustworthy__ A
| PrivateKey__ A B C | PublicKey__ A B C
| Conveyed__ A TY2 | Possesses__ A TY2 | Received__ A TY2
| Recognizes__ A TY2 | NeverMalFromSelf__ A B TY2
| Sends__ A TY2 B | SharedSecret__ A TY2 B
| Believes__ A TY3 | And__ TY3 TY3";;
(* ------------------------------------------------------------------------- *)
(* Some with nesting of various kinds, plus required auxiliaries. *)
(* ------------------------------------------------------------------------- *)
let term_INDUCTION,term_RECURSION = time define_type
"term = Vari int | Fni int (term list)";;
let bintree_INDUCTION,bintree_RECURSION = time define_type
"bintree = Leafb | Branchb (bintree # bintree)";;
let etree_INDUCTION,etree_RECURSION = time define_type
"etree = Terminal | Nonterminal (num + etree)";;
let ptree_INDUCTION,ptree_RECURSION = time define_type
"ptree = Only (ptree option)";;
let mut_INDUCTION,mut_RECURSION = time define_type
"mutual = Mutual A mutual D otherone | Friend D otherone;
otherone = Great C | Expectations mutual otherone";;
let groof_INDUCTION,groof_RECURSION = time define_type
"groof = Wu bool
| Wibble (A,groof,L)mutual
| Wobble groof groof";;
let biterm_INDUCTION,biterm_RECURSION = time define_type
"biterm = Variab int
| Fnapp (biterm list + biterm list)";;
let triterm_INDUCTION,triterm_RECURSION = time define_type
"triterm = Var0 int
| Fun2 (triterm list + triterm list)
| Fun1 (triterm list)";;
let xtree_INDUCTION,xtree_RECURSION = time define_type
"xtree = Leafx A
| Branchx (xtree list)";;
let simper_INDUCTION,simper_RECURSION = time define_type
"simper = Leaves A B
| Bough (simper xtree)";;
let array_INDUCTION,array_RECURSION = time define_type
"array = Array num (A list)";;
let value_INDUCTION,value_RECURSION = time define_type
"value = Integer num
| Boolean bool
| List_of (value list)
| Tree_of (value xtree)
| Array_of (value array)";;
let example_INDUCTION,example_RECURSION = time define_type
"command = Assignment (num list # expression list)
| Sequence (command list);
expression = Numeral num
| Plus (expression # expression)
| Valof command";;
let zonk_INDUCTION,zonk_RECURSION = time define_type
"zonk = Stonk ((zonk,pink,A)mutual)list # expression
| Tonk zonk (pink list)
| Honk num;
pink = Floyd (zonk # pink)
| Purple num
| Rain (A # pink)";;
(* ------------------------------------------------------------------------- *)
(* Example from Konrad Slind: 68000 instruction set. *)
(* ------------------------------------------------------------------------- *)
time define_type "Size = Byte | Word | Long";;
time define_type "DataRegister
= RegD0
| RegD1
| RegD2
| RegD3
| RegD4
| RegD5
| RegD6
| RegD7";;
time define_type "AddressRegister
= RegA0
| RegA1
| RegA2
| RegA3
| RegA4
| RegA5
| RegA6
| RegA7";;
time define_type "DataOrAddressRegister
= data DataRegister
| address AddressRegister";;
time define_type "Condition
= Hi
| Ls
| Cc
| Cs
| Ne
| Eq
| Vc
| Vs
| Pl
| Mi
| Ge
| Lt
| Gt
| Le";;
time define_type "AddressingMode
= immediate num
| direct DataOrAddressRegister
| indirect AddressRegister
| postinc AddressRegister
| predec AddressRegister
| indirectdisp num AddressRegister
| indirectindex num AddressRegister DataOrAddressRegister Size
| absolute num
| pcdisp num
| pcindex num DataOrAddressRegister Size";;
time define_type "M68kInstruction
= ABCD AddressingMode AddressingMode
| ADD Size AddressingMode AddressingMode
| ADDA Size AddressingMode AddressRegister
| ADDI Size num AddressingMode
| ADDQ Size num AddressingMode
| ADDX Size AddressingMode AddressingMode
| AND Size AddressingMode AddressingMode
| ANDI Size num AddressingMode
| ANDItoCCR num
| ANDItoSR num
| ASL Size AddressingMode DataRegister
| ASLW AddressingMode
| ASR Size AddressingMode DataRegister
| ASRW AddressingMode
| Bcc Condition Size num
| BTST Size AddressingMode AddressingMode
| BCHG Size AddressingMode AddressingMode
| BCLR Size AddressingMode AddressingMode
| BSET Size AddressingMode AddressingMode
| BRA Size num
| BSR Size num
| CHK AddressingMode DataRegister
| CLR Size AddressingMode
| CMP Size AddressingMode DataRegister
| CMPA Size AddressingMode AddressRegister
| CMPI Size num AddressingMode
| CMPM Size AddressRegister AddressRegister
| DBT DataRegister num
| DBF DataRegister num
| DBcc Condition DataRegister num
| DIVS AddressingMode DataRegister
| DIVU AddressingMode DataRegister
| EOR Size DataRegister AddressingMode
| EORI Size num AddressingMode
| EORItoCCR num
| EORItoSR num
| EXG DataOrAddressRegister DataOrAddressRegister
| EXT Size DataRegister
| ILLEGAL
| JMP AddressingMode
| JSR AddressingMode
| LEA AddressingMode AddressRegister
| LINK AddressRegister num
| LSL Size AddressingMode DataRegister
| LSLW AddressingMode
| LSR Size AddressingMode DataRegister
| LSRW AddressingMode
| MOVE Size AddressingMode AddressingMode
| MOVEtoCCR AddressingMode
| MOVEtoSR AddressingMode
| MOVEfromSR AddressingMode
| MOVEtoUSP AddressingMode
| MOVEfromUSP AddressingMode
| MOVEA Size AddressingMode AddressRegister
| MOVEMto Size AddressingMode DataOrAddressRegister list
| MOVEMfrom Size DataOrAddressRegister list AddressingMode
| MOVEP Size AddressingMode AddressingMode
| MOVEQ num DataRegister
| MULS AddressingMode DataRegister
| MULU AddressingMode DataRegister
| NBCD AddressingMode
| NEG Size AddressingMode
| NEGX Size AddressingMode
| NOP
| NOT Size AddressingMode
| OR Size AddressingMode AddressingMode
| ORI Size num AddressingMode
| ORItoCCR num
| ORItoSR num
| PEA AddressingMode
| RESET
| ROL Size AddressingMode DataRegister
| ROLW AddressingMode
| ROR Size AddressingMode DataRegister
| RORW AddressingMode
| ROXL Size AddressingMode DataRegister
| ROXLW AddressingMode
| ROXR Size AddressingMode DataRegister
| ROXRW AddressingMode
| RTE
| RTR
| RTS
| SBCD AddressingMode AddressingMode
| ST AddressingMode
| SF AddressingMode
| Scc Condition AddressingMode
| STOP num
| SUB Size AddressingMode AddressingMode
| SUBA Size AddressingMode AddressingMode
| SUBI Size num AddressingMode
| SUBQ Size num AddressingMode
| SUBX Size AddressingMode AddressingMode
| SWAP DataRegister
| TAS AddressingMode
| TRAP num
| TRAPV
| TST Size AddressingMode
| UNLK AddressRegister";;
(* ------------------------------------------------------------------------- *)
(* Example from Myra VanInwegen: part of the syntax of SML. *)
(* ------------------------------------------------------------------------- *)
let string_INDUCTION,string_RECURSION = time define_type
"string = EMPTY_STRING | CONS_STRING num string";;
let strid_INDUCTION,strid_RECURSION = time define_type
"strid = STRID string;
var = VAR string;
con = CON string;
scon = SCINT int | SCSTR string;
excon = EXCON string;
label = LABEL string";;
let nonemptylist_INDUCTION,nonemptylist_RECURSION = time define_type
"nonemptylist = Head_and_tail A (A list)";;
let long_INDUCTION,long_RECURSION = time define_type
"long = BASE A | QUALIFIED strid long";;
let myra_INDUCTION,myra_RECURSION = time define_type
"atpat_e = WILDCARDatpat_e
| SCONatpat_e scon
| VARatpat_e var
| CONatpat_e (con long)
| EXCONatpat_e (excon long)
| RECORDatpat_e (patrow_e option)
| PARatpat_e pat_e;
patrow_e = DOTDOTDOT_e
| PATROW_e label pat_e (patrow_e option);
pat_e = ATPATpat_e atpat_e
| CONpat_e (con long) atpat_e
| EXCONpat_e (excon long) atpat_e
| LAYEREDpat_e var pat_e;
conbind_e = CONBIND_e con (conbind_e option);
datbind_e = DATBIND_e conbind_e (datbind_e option);
exbind_e = EXBIND1_e excon (exbind_e option)
| EXBIND2_e excon (excon long) (exbind_e option);
atexp_e = SCONatexp_e scon
| VARatexp_e (var long)
| CONatexp_e (con long)
| EXCONatexp_e (excon long)
| RECORDatexp_e (exprow_e option)
| LETatexp_e dec_e exp_e
| PARatexp_e exp_e;
exprow_e = EXPROW_e label exp_e (exprow_e option);
exp_e = ATEXPexp_e atexp_e
| APPexp_e exp_e atexp_e
| HANDLEexp_e exp_e match_e
| RAISEexp_e exp_e
| FNexp_e match_e;
match_e = MATCH_e mrule_e (match_e option);
mrule_e = MRULE_e pat_e exp_e;
dec_e = VALdec_e valbind_e
| DATATYPEdec_e datbind_e
| ABSTYPEdec_e datbind_e dec_e
| EXCEPTdec_e exbind_e
| LOCALdec_e dec_e dec_e
| OPENdec_e ((strid long) nonemptylist)
| EMPTYdec_e
| SEQdec_e dec_e dec_e;
valbind_e = PLAINvalbind_e pat_e exp_e (valbind_e option)
| RECvalbind_e valbind_e";;
(* ------------------------------------------------------------------------- *)
(* Example from Daryl Stewart: a Verilog grammar. *)
(* ------------------------------------------------------------------------- *)
let daryl_INDUCTION,daryl_RECURSION = time define_type
"Source_text
= module string (string list) (Module_item list)
| Source_textMeta string;
Module_item
= declaration Declaration
| initial Statement
| always Statement
| assign Lvalue Exprn
| Module_itemMeta string;
Declaration
= reg_declaration (Range option) (string list)
| net_declaration (Range option) (string list)
| input_declaration (Range option) (string list)
| output_declaration (Range option) (string list)
| DeclarationMeta string;
Range = range Exprn Exprn | RangeMeta string;
Statement
= clock_statement Clock Statement_or_null
| blocking_assignment Lvalue Exprn
| non_blocking_assignment Lvalue Exprn
| conditional_statement
Exprn Statement_or_null (Statement_or_null option)
| case_statement Exprn (Case_item list)
| while_loop Exprn Statement
| repeat_loop Exprn Statement
| for_loop
Lvalue Exprn Exprn Lvalue Exprn Statement
| forever_loop Statement
| disable string
| seq_block (string option) (Statement list)
| StatementMeta string;
Statement_or_null
= statement Statement | null_statement | Statement_or_nullMeta string;
Clock
= posedge string
| negedge string
| clock string
| ClockMeta string;
Case_item
= case_item (Exprn list) Statement_or_null
| default_case_item Statement_or_null
| Case_itemMeta string;
Exprn
= plus Exprn Exprn
| minus Exprn Exprn
| lshift Exprn Exprn
| rshift Exprn Exprn
| lt Exprn Exprn
| leq Exprn Exprn
| gt Exprn Exprn
| geq Exprn Exprn
| logeq Exprn Exprn
| logneq Exprn Exprn
| caseeq Exprn Exprn
| caseneq Exprn Exprn
| bitand Exprn Exprn
| bitxor Exprn Exprn
| bitor Exprn Exprn
| logand Exprn Exprn
| logor Exprn Exprn
| conditional Exprn Exprn Exprn
| positive Primary
| negative Primary
| lognot Primary
| bitnot Primary
| reducand Primary
| reducxor Primary
| reducor Primary
| reducnand Primary
| reducxnor Primary
| reducnor Primary
| primary Primary
| ExpressionMeta string;
Primary
= primary_number Number
| primary_IDENTIFIER string
| primary_bit_select string Exprn
| primary_part_select string Exprn Exprn
| primary_gen_bit_select Exprn Exprn
| primary_gen_part_select Exprn Exprn Exprn
| primary_concatenation Concatenation
| primary_multiple_concatenation Multiple_concatenation
| brackets Exprn
| PrimaryMeta string;
Lvalue
= lvalue string
| lvalue_bit_select string Exprn
| lvalue_part_select string Exprn Exprn
| lvalue_concatenation Concatenation
| LvalueMeta string;
Number
= decimal string
| based string option string
| NumberMeta string;
Concatenation
= concatenation (Exprn list) | ConcatenationMeta string;
Multiple_concatenation
= multiple_concatenation Exprn (Exprn list)
| Multiple_concatenationMeta string;
meta
= Meta_Source_text Source_text
| Meta_Module_item Module_item
| Meta_Declaration Declaration
| Meta_Range Range
| Meta_Statement Statement
| Meta_Statement_or_null Statement_or_null
| Meta_Clock Clock
| Meta_Case_item Case_item
| Meta_Expression Exprn
| Meta_Primary Primary
| Meta_Lvalue Lvalue
| Meta_Number Number
| Meta_Concatenation Concatenation
| Meta_Multiple_concatenation Multiple_concatenation";;