转载请注明版权.
This is a python flow chart drawing implementation.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# flow_parser.py
# author: Rongzhou Shen
# date: 2009-02-11
from pyparsing import *
# PYPARSING DEFINITION =========================
LSQUARE, RSQUARE, SEMI, ASSIGN, QUOTE = map(Suppress, '[];="')
LBRACE, RBRACE, AT, LBRACK, RBRACK = map(Suppress, '{}@()')
# Definition part of the flow_def file
node_id = Word(alphanums + "_")("id")
node_type = Word(alphas)("type")
declaration = node_type + LSQUARE + node_id + RSQUARE
value = QuotedString('"')
definition = Group(declaration("declaration") + ASSIGN + value("value") + SEMI)
# Flow part of the flow_def file
flow = Group(node_id + OneOrMore(Group('=>' + node_id)) + SEMI)
# Grammar definition of the whole file
flow_impl = OneOrMore(definition)("definitions") + OneOrMore(flow)("flows")
flow_def = AT + LBRACK + QuotedString('"')("flow_name") + RBRACK + LBRACE +\
flow_impl("flow_impl") + RBRACE
# END PYPARSING DEFINITION ==============================
#sample = """
#@("A test flow_chart") {
# process[node1] = "This is a test process";
# process[node2] = "This is another test process";
# a => b => c;
# ffew => fweji;
#}"""
def test_parse():
expected = ['process', '[', 'node1', ']', '=', '"',
'This is a test process', '"', ';']
test_def = 'process[node1] = "This is a test process";'
data = definition.parseString(test_def)
assert len(data) == len(expected)
assert all([x == y for x, y in zip(expected, data)])
expected = ['a', '=>', 'b', '=>', 'c', ';']
test_flow = 'a => b => c;'
data = flow.parseString(test_flow)
assert len(data) == len(expected)
assert all([x == y for x, y in zip(expected, data)])
用法如下:
Usage:
@("This is a test graph") {
process[p1] = "This is a test process";
process[p2] = "This is another process";
condition[c1] = "This is a condition";
p1 => p2;
c1 => p1;
c1 => p2;
}
结果如下:
The flow chart generated is:
No comments :
Post a Comment