def fsm_diagram(grammar, start_symbol=START_SYMBOL): def left_align(label): return dot_escape(label.replace('\n', r'\l')).replace(r'\\l', '\\l') dot = Digraph(comment="Grammar as Finite State Machine") symbols = deque([start_symbol]) symbols_seen = set() while len(symbols) > 0: symbol = symbols.popleft() symbols_seen.add(symbol) dot.node(symbol, dot_escape(unicode_escape(symbol))) for expansion in grammar[symbol]: nts = nonterminals(expansion) if len(nts) > 0: target_symbol = nts[-1] if target_symbol not in symbols_seen: symbols.append(target_symbol) label = expansion.replace(target_symbol, '') dot.edge(symbol, target_symbol, left_align(unicode_escape(label))) return display(dot)
def left_align(label): return dot_escape(label.replace('\n', r'\l')).replace(r'\\l', '\\l')
print('\n### User Interfaces as Finite State Machines') if __name__ == "__main__": from graphviz import Digraph if __name__ == "__main__": from IPython.display import display if __package__ is None or __package__ == "": from GrammarFuzzer import dot_escape else: from .GrammarFuzzer import dot_escape if __name__ == "__main__": dot = Digraph(comment="Finite State Machine") dot.node(dot_escape('<start>')) dot.edge(dot_escape('<start>'), dot_escape('<Order Form>')) dot.edge(dot_escape('<Order Form>'), dot_escape('<Terms and Conditions>'), "click('Terms and conditions')") dot.edge(dot_escape('<Order Form>'), dot_escape('<Thank You>'), "fill(...)\lsubmit('submit')") dot.edge(dot_escape('<Terms and Conditions>'), dot_escape('<Order Form>'), "click('order form')") dot.edge(dot_escape('<Thank You>'), dot_escape('<Order Form>'), "click('order form')") display(dot) # ### State Machines as Grammars if __name__ == "__main__": print('\n### State Machines as Grammars')
from graphviz import Digraph if __name__ == "__main__": from IPython.display import display if __package__ is None or __package__ == "": from GrammarFuzzer import dot_escape else: from .GrammarFuzzer import dot_escape if __name__ == "__main__": dot = Digraph(comment="Finite State Machine") dot.node(dot_escape('<start>')) dot.edge(dot_escape('<start>'), dot_escape('<Order Form>')) dot.edge(dot_escape('<Order Form>'), dot_escape('<Terms and Conditions>'), "click('Terms and conditions')") dot.edge(dot_escape('<Order Form>'), dot_escape('<Thank You>'), "fill(...)\lsubmit('submit')") dot.edge(dot_escape('<Terms and Conditions>'), dot_escape('<Order Form>'), "click('order form')") dot.edge(dot_escape('<Thank You>'), dot_escape('<Order Form>'), "click('order form')") display(dot) # ### State Machines as Grammars if __name__ == "__main__": print('\n### State Machines as Grammars')
def hl_node(dot, nid, symbol, ann): if predicate(dot, nid, symbol, ann): dot.node(repr(nid), dot_escape(symbol), fontcolor='red') else: dot.node(repr(nid), dot_escape(symbol))