123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- from state.devstate import DevState
- from bootstrap.scd import bootstrap_scd
- from framework.conformance import Conformance, render_conformance_check_result
- from concrete_syntax.textual_cd import parser as parser_cd
- from concrete_syntax.textual_od import parser as parser_od
- from concrete_syntax.textual_od import renderer as renderer_od
- from concrete_syntax.common import indent
- from concrete_syntax.plantuml import renderer as plantuml
- from util.prompt import yes_no, pause
- state = DevState()
- print("Loading meta-meta-model...")
- scd_mmm = bootstrap_scd(state)
- print("OK")
- print("Is our meta-meta-model a valid class diagram?")
- conf = Conformance(state, scd_mmm, scd_mmm)
- print(render_conformance_check_result(conf.check_nominal()))
- # If you are curious, you can serialize the meta-meta-model:
- # print("--------------")
- # print(indent(
- # renderer.render_od(state,
- # m_id=scd_mmm,
- # mm_id=scd_mmm),
- # 4))
- # print("--------------")
- # Change this:
- woods_mm_cs = """
- abstract class Animal
- class Bear (Animal) # Bear inherits Animal
- class Man [1..2] (Animal) {
- Integer weight `get_value(get_target(this)) > 20`; # <- constraint in context of attribute-link
- `get_value(get_slot(this, "weight")) > 20` # <- constraint in context of Man-object
- }
- association afraidOf [0..6] Man -> Animal [1..2]
- global total_weight_small_enough ```
- total_weight = 0
- for man_name, man_id in get_all_instances("Man"):
- total_weight += get_value(get_slot(man_id, "weight"))
- total_weight < 85
- ```
- """
- print()
- print("Parsing 'woods' meta-model...")
- woods_mm = parser_cd.parse_cd(
- state,
- m_text=woods_mm_cs, # the string of text to parse
- )
- print("OK")
- # We can serialize the class diagram to our object diagram syntax
- # (because the class diagram IS also an object diagram):
- print("--------------")
- print(indent(
- renderer_od.render_od(state,
- m_id=woods_mm,
- mm_id=scd_mmm),
- 4))
- print("--------------")
- print("Is our 'woods' meta-model a valid class diagram?")
- conf = Conformance(state, woods_mm, scd_mmm)
- print(render_conformance_check_result(conf.check_nominal()))
- # Change this:
- woods_m_cs = """
- george:Man {
- weight = 15;
- }
- billy:Man {
- weight = 100;
- }
- bear1:Bear
- bear2:Bear
- :afraidOf (george -> bear1)
- :afraidOf (george -> bear2)
- """
- print()
- print("Parsing 'woods' model...")
- woods_m = parser_od.parse_od(
- state,
- m_text=woods_m_cs,
- mm=woods_mm, # this time, the meta-model is the previous model we parsed
- )
- print("OK")
- # As a double-check, you can serialize the parsed model:
- # print("--------------")
- # print(indent(
- # renderer.render_od(state,
- # m_id=woods_m,
- # mm_id=woods_mm),
- # 4))
- # print("--------------")
- print("Is our model a valid woods-diagram?")
- conf = Conformance(state, woods_m, woods_mm)
- print(render_conformance_check_result(conf.check_nominal()))
- print()
- print("==================================")
- if yes_no("Print PlantUML?"):
- print_mm = yes_no(" ▸ Print meta-model?")
- print_m = yes_no(" ▸ Print model?")
- print_conf = print_mm and print_m and yes_no(" ▸ Print conformance links?")
- uml = ""
- if print_mm:
- uml += plantuml.render_package("Meta-model", plantuml.render_class_diagram(state, woods_mm))
- if print_m:
- uml += plantuml.render_package("Model", plantuml.render_object_diagram(state, woods_m, woods_mm))
- if print_conf:
- uml += plantuml.render_trace_conformance(state, woods_m, woods_mm)
- print("==================================")
- print(uml)
- print("==================================")
- print("Go to either:")
- print(" ▸ https://www.plantuml.com/plantuml/uml")
- print(" ▸ https://mstro.duckdns.org/plantuml/uml")
- print("and paste the above string.")
|