From efb1420ab7797d1334ca964d0f622c4b41432e87 Mon Sep 17 00:00:00 2001 From: Yann Salmon Date: Mon, 22 Feb 2021 20:27:30 +0100 Subject: [PATCH] Update devuldertex2latex.py --- latex/devuldertex2latex.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/latex/devuldertex2latex.py b/latex/devuldertex2latex.py index 4edca10..25bd8e0 100644 --- a/latex/devuldertex2latex.py +++ b/latex/devuldertex2latex.py @@ -23,12 +23,24 @@ def automate(s) : bounding_box = (x, y) intro.setParseAction(assign_bb) + # parfois, le double cercle des états acceptants est réalisé en superposant deux états de diamètres différents + curstatediam = None + def do_setstatediam(toks) : + nonlocal curstatediam + curstatediam = toks[0] + statediam = ("\\setstatediam"+"{"+integer+"}").setParseAction(do_setstatediam) + # letstate etats = {} + etats_alias = {} def do_letstate(s, l, toks) : id, x, y = toks - nonlocal etats - etats[id] = {"id": id, "posx": x, "posy": y, "initial": False, "accepting": False, "label": ""} + nonlocal etats, curstatediam, etats_alias + for ancien in [e for e in etats.values() if e["posx"] == x and e["posy"] == y and e["statediam"] != curstatediam] : + ancien["accepting"] = True + etats_alias[id] = ancien["id"] + return + etats[id] = {"id": id, "posx": x, "posy": y, "initial": False, "accepting": False, "label": "", "statediam" : curstatediam} letstate = (r"\letstate " + ident + "=(" + integer + "," + integer + ")").setParseAction(do_letstate) # catégories d'états @@ -47,24 +59,30 @@ def automate(s) : transitions = [] def do_trans(toks) : nature, indication, orig, dest, label = toks - nonlocal transitions + nonlocal transitions, etats_alias if "curved" in nature : bend = True else : bend = False + orig = etats_alias.get(orig, orig) + dest = etats_alias.get(dest, dest) transitions.append({"orig": orig, "dest": dest, "label": label, "bend": bend, "indication":indication}) trans = (pyp.oneOf(["\\drawcurvedtrans", "\\drawtrans", "\\drawedge"]) + pyp.Optional("["+ident+"]", default=None) + "(" + ident + "," + ident + ")" + maybelabel).setParseAction(do_trans) boucles = [] def do_loop(toks) : indication, etat, label = toks - nonlocal boucles + nonlocal boucles, etats_alias + etat = etats_alias.get(etat, etat) boucles.append({"indication":indication, "orig":etat, "label":label}) loop = ("\\drawloop" + pyp.Optional("[" + ident + "]", default=None) + "(" + ident + ")" + maybelabel).setParseAction(do_loop) - ignorer = ("\\setprofcurve" + "{" + integer + "}") | ("\\setloopdiam" + "{" + integer + "}") | ("\\setstatediam"+"{"+integer+"}") - statement = letstate | drawstate | trans | loop | ignorer.suppress() + + ignorer = ("\\setprofcurve" + "{" + integer + "}") | ("\\setloopdiam" + "{" + integer + "}") + + + statement = letstate | drawstate | trans | loop | statediam | ignorer.suppress() outro = pyp.Suppress(r"\end{picture}")