483 add_rename aut source_aut rename_f; |
483 add_rename aut source_aut rename_f; |
484 |
484 |
485 |
485 |
486 (* outer syntax *) |
486 (* outer syntax *) |
487 |
487 |
488 local structure P = OuterParse and K = OuterKeyword in |
488 val _ = List.app Keyword.keyword ["signature", "actions", "inputs", |
489 |
|
490 val _ = List.app OuterKeyword.keyword ["signature", "actions", "inputs", |
|
491 "outputs", "internals", "states", "initially", "transitions", "pre", |
489 "outputs", "internals", "states", "initially", "transitions", "pre", |
492 "post", "transrel", ":=", "compose", "hide_action", "in", "restrict", "to", |
490 "post", "transrel", ":=", "compose", "hide_action", "in", "restrict", "to", |
493 "rename"]; |
491 "rename"]; |
494 |
492 |
495 val actionlist = P.list1 P.term; |
493 val actionlist = Parse.list1 Parse.term; |
496 val inputslist = P.$$$ "inputs" |-- P.!!! actionlist; |
494 val inputslist = Parse.$$$ "inputs" |-- Parse.!!! actionlist; |
497 val outputslist = P.$$$ "outputs" |-- P.!!! actionlist; |
495 val outputslist = Parse.$$$ "outputs" |-- Parse.!!! actionlist; |
498 val internalslist = P.$$$ "internals" |-- P.!!! actionlist; |
496 val internalslist = Parse.$$$ "internals" |-- Parse.!!! actionlist; |
499 val stateslist = P.$$$ "states" |-- P.!!! (Scan.repeat1 (P.name --| P.$$$ "::" -- P.typ)); |
497 val stateslist = |
500 val initial = P.$$$ "initially" |-- P.!!! P.term; |
498 Parse.$$$ "states" |-- Parse.!!! (Scan.repeat1 (Parse.name --| Parse.$$$ "::" -- Parse.typ)); |
501 val assign_list = P.list1 (P.name --| P.$$$ ":=" -- P.!!! P.term); |
499 val initial = Parse.$$$ "initially" |-- Parse.!!! Parse.term; |
502 val pre = P.$$$ "pre" |-- P.!!! P.term; |
500 val assign_list = Parse.list1 (Parse.name --| Parse.$$$ ":=" -- Parse.!!! Parse.term); |
503 val post = P.$$$ "post" |-- P.!!! assign_list; |
501 val pre = Parse.$$$ "pre" |-- Parse.!!! Parse.term; |
|
502 val post = Parse.$$$ "post" |-- Parse.!!! assign_list; |
504 val pre1 = (pre -- (Scan.optional post [])) >> mk_trans_of_prepost; |
503 val pre1 = (pre -- (Scan.optional post [])) >> mk_trans_of_prepost; |
505 val post1 = ((Scan.optional pre "True") -- post) >> mk_trans_of_prepost; |
504 val post1 = ((Scan.optional pre "True") -- post) >> mk_trans_of_prepost; |
506 val transrel = (P.$$$ "transrel" |-- P.!!! P.term) >> mk_trans_of_rel; |
505 val transrel = (Parse.$$$ "transrel" |-- Parse.!!! Parse.term) >> mk_trans_of_rel; |
507 val transition = P.term -- (transrel || pre1 || post1); |
506 val transition = Parse.term -- (transrel || pre1 || post1); |
508 val translist = P.$$$ "transitions" |-- P.!!! (Scan.repeat1 transition); |
507 val translist = Parse.$$$ "transitions" |-- Parse.!!! (Scan.repeat1 transition); |
509 |
508 |
510 val ioa_decl = |
509 val ioa_decl = |
511 (P.name -- (P.$$$ "=" |-- |
510 (Parse.name -- (Parse.$$$ "=" |-- |
512 (P.$$$ "signature" |-- |
511 (Parse.$$$ "signature" |-- |
513 P.!!! (P.$$$ "actions" |-- |
512 Parse.!!! (Parse.$$$ "actions" |-- |
514 (P.typ -- |
513 (Parse.typ -- |
515 (Scan.optional inputslist []) -- |
514 (Scan.optional inputslist []) -- |
516 (Scan.optional outputslist []) -- |
515 (Scan.optional outputslist []) -- |
517 (Scan.optional internalslist []) -- |
516 (Scan.optional internalslist []) -- |
518 stateslist -- |
517 stateslist -- |
519 (Scan.optional initial "True") -- |
518 (Scan.optional initial "True") -- |
520 translist))))) >> mk_ioa_decl || |
519 translist))))) >> mk_ioa_decl || |
521 (P.name -- (P.$$$ "=" |-- (P.$$$ "compose" |-- P.!!! (P.list1 P.name)))) |
520 (Parse.name -- (Parse.$$$ "=" |-- (Parse.$$$ "compose" |-- Parse.!!! (Parse.list1 Parse.name)))) |
522 >> mk_composition_decl || |
521 >> mk_composition_decl || |
523 (P.name -- (P.$$$ "=" |-- (P.$$$ "hide_action" |-- |
522 (Parse.name -- (Parse.$$$ "=" |-- (Parse.$$$ "hide_action" |-- |
524 P.!!! (P.list1 P.term -- (P.$$$ "in" |-- P.name))))) >> mk_hiding_decl || |
523 Parse.!!! (Parse.list1 Parse.term -- (Parse.$$$ "in" |-- Parse.name))))) >> mk_hiding_decl || |
525 (P.name -- (P.$$$ "=" |-- (P.$$$ "restrict" |-- |
524 (Parse.name -- (Parse.$$$ "=" |-- (Parse.$$$ "restrict" |-- |
526 P.!!! (P.name -- (P.$$$ "to" |-- P.list1 P.term))))) >> mk_restriction_decl || |
525 Parse.!!! (Parse.name -- (Parse.$$$ "to" |-- Parse.list1 Parse.term))))) >> mk_restriction_decl || |
527 (P.name -- (P.$$$ "=" |-- (P.$$$ "rename" |-- (P.!!! (P.name -- (P.$$$ "to" |-- P.term)))))) |
526 (Parse.name -- (Parse.$$$ "=" |-- |
|
527 (Parse.$$$ "rename" |-- (Parse.!!! (Parse.name -- (Parse.$$$ "to" |-- Parse.term)))))) |
528 >> mk_rename_decl; |
528 >> mk_rename_decl; |
529 |
529 |
530 val _ = |
530 val _ = |
531 OuterSyntax.command "automaton" "define Lynch/Vaandrager-style I/O automaton" K.thy_decl |
531 Outer_Syntax.command "automaton" "define Lynch/Vaandrager-style I/O automaton" Keyword.thy_decl |
532 (ioa_decl >> Toplevel.theory); |
532 (ioa_decl >> Toplevel.theory); |
533 |
533 |
534 end; |
534 end; |
535 |
|
536 end; |
|