Commit d19b237f authored by Savva Golubitsky's avatar Savva Golubitsky

pregen idle run ready

parent 9689f34c
...@@ -34,7 +34,7 @@ class Func(): ...@@ -34,7 +34,7 @@ class Func():
def __str__(self): def __str__(self):
if self.module =="" or self.name =="": if self.module =="" or self.name =="":
return '' return ''
return "{}_{}".format(self.module, self.name) return "{}_{};".format(self.module, self.name)
class Selector(Func): class Selector(Func):
def __init__(self, ntransf, module="", name="", dummy=False): def __init__(self, ntransf, module="", name="", dummy=False):
......
...@@ -258,14 +258,6 @@ class Parser(): ...@@ -258,14 +258,6 @@ class Parser():
dot = re.sub(r"((digraph)|}|{)", "", dot) dot = re.sub(r"((digraph)|}|{)", "", dot)
dot = re.sub(r"\/\/.*", "", dot) dot = re.sub(r"\/\/.*", "", dot)
dot = re.sub(r"^\n$", "", dot) dot = re.sub(r"^\n$", "", dot)
#print("Checking graph...")
#graphcheck = re.search(r"\A(digraph)\w+\n?{((\/\/)*.*\n*)+}\Z", dot)
#if graphcheck is None:
# print("Incorrect graph, check syntax!")
# exit()
#
#print("Graph id good, processing!")
#dot = re.sub(r"//*$", "", dot)
dotlines = dot.splitlines() dotlines = dot.splitlines()
dotlines = list(filter(None, dotlines)) dotlines = list(filter(None, dotlines))
self.fact.name = dotlines[0] self.fact.name = dotlines[0]
...@@ -305,8 +297,69 @@ class Parser(): ...@@ -305,8 +297,69 @@ class Parser():
self.edgemap[root] = list(filter(lambda x: x["morph"] != '', edges)) self.edgemap[root] = list(filter(lambda x: x["morph"] != '', edges))
return return
checked=[]
bushes = []
def generate_cpp(self): def generate_cpp(self):
self._gen_branch(self.fact.graph.init_state) states_to_check = [self.fact.graph.init_state]
print(self.edgemap) while len(states_to_check)!=0:
for st in states_to_check:
self.checked.append(st)
states_to_check.remove(st)
bush = _Bush(st)
print("ins:", bush.state.name)
bush.grow_bush()
self.bushes.append(bush)
for i, br in enumerate(bush.branches):
for b in br:
print(i, b)
print("outs:")
for outs in bush.outstates:
print(outs.name)
if outs not in states_to_check and outs not in self.checked:
states_to_check.append(outs)
class _Tr():
slots=(
'pred',
'morph'
)
def __init__(self, transf):
self.pred = transf.edge.pred_f
self.morph = transf.edge.morph_f
def __str__(self):
return "{}\n{}\n".format(self.pred, self.morph)
class _Bush():
__slots__=(
'state',
'selector',
'branches',
'outstates'
)
def __init__(self, state):
self.state = state
self.selector = state.selector
self.branches = []
self.outstates = []
def grow_bush(self):
for t in self.state.transfers:
branch = [_Tr(t)]
self._gen_branch(t.output_state, branch)
def _gen_branch(self, cur_state, branch):
# print("generating", cur_state.name)
while len(cur_state.transfers)==1 and cur_state.input_edges_number==1:
tr = cur_state.transfers[0]
branch.append(_Tr(tr))
cur_state = tr.output_state
self.branches.append(branch)
if cur_state not in self.outstates:
self.outstates.append(cur_state)
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
typedef std::function<int(com::Anymap)> IntFunc; typedef std::function<int(com::Anymap)> IntFunc;
typedef std::function<bool(com::Anymap)> BoolFunc; typedef std::function<bool(com::Anymap)> BoolFunc;
typedef std::function<std::list<bool>(com::Anymap)> BoolListFunc; typedef std::function<bool*(com::Anymap)> BoolArrFunc;
IntFunc LoadEntry(std::string lib, std::string func) { IntFunc LoadEntry(std::string lib, std::string func) {
DllHandle handler; DllHandle handler;
...@@ -16,12 +16,11 @@ BoolFunc LoadPred(std::string lib, std::string func) { ...@@ -16,12 +16,11 @@ BoolFunc LoadPred(std::string lib, std::string func) {
return com::lib::loadFunction<int (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler); return com::lib::loadFunction<int (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
} }
BoolListFunc LoadSelector(std::string lib, std::string func){ BoolArrFunc LoadSelector(std::string lib, std::string func){
DllHandle handler; DllHandle handler;
return com::lib::loadFunction<std::list<bool> (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler); return com::lib::loadFunction<std::list<bool> (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
} }
int main(int argc, char const *argv[]) int main(int argc, char const *argv[])
{ {
auto data = com::Anymap(); auto data = com::Anymap();
...@@ -35,23 +34,15 @@ int main(int argc, char const *argv[]) ...@@ -35,23 +34,15 @@ int main(int argc, char const *argv[])
} }
entrFunc(data); entrFunc(data);
SELECTOR: SELECTOR:
ST_selector_val = selector(data); ST_selector_val = selector(data);
for (int i=0; i<ST_selector_val.size(); i++) { if (ST_selector_val[0]) {
std::thread thr(); branch1();
goto TERM; }
//if (ST_selector_val.begin+0) { if(ST_selector_val[1]) {
// ST_selector_val.begin+0 = !ST_selector_val.begin+0; branch2();
// goto TERM;
//}
//if (ST_selector_val.begin+1) {
// ST_selector_val.begin+1 = !ST_selector_val.begin+1;
// goto SELECTOR;
//}
} }
TERM: TERM:
std::cout<<"Termination!\n"; std::cout<<"Termination!\n";
return 0; return 0;
......
...@@ -11,8 +11,11 @@ from comsdk.edge import Edge ...@@ -11,8 +11,11 @@ from comsdk.edge import Edge
prsr = pars.Parser(tocpp=True) prsr = pars.Parser(tocpp=True)
data = {"a":10} data = {"a":10}
gr = prsr.parse_file('./tests/adot/testsimple.adot') gr = prsr.parse_file('./tests/adot/testsimple.adot')
gr.run(data) # gr.run(data)
print (data) # print (data)
print(prsr.generate_cpp()) print(prsr.generate_cpp())
for b in prsr.bushes:
...@@ -2,9 +2,19 @@ digraph SIMPLE { ...@@ -2,9 +2,19 @@ digraph SIMPLE {
FUNC [module=libprinters, entry_func=PrintHello] FUNC [module=libprinters, entry_func=PrintHello]
PRED [module=libprinters, entry_func=ReturnTrue] PRED [module=libprinters, entry_func=ReturnTrue]
MORPH [predicate=PRED, function=FUNC] MORPH [predicate=PRED, function=FUNC]
FUNC1 [module=libprinters, entry_func=PrintHello1]
PRED1 [module=libprinters, entry_func=ReturnTrue1]
MORPH1 [predicate=PRED1, function=FUNC1]
FUNC2 [module=libprinters, entry_func=PrintHello2]
PRED2 [module=libprinters, entry_func=ReturnTrue2]
MORPH2 [predicate=PRED2, function=FUNC2]
__BEGIN__ -> ST1 [morphism = MORPH] __BEGIN__ -> ST1 [morphism = MORPH]
ST1 -> ST2 [morphism = MORPH] ST1 -> ST2, ST21 [morphism = (MORPH, MORPH1)]
ST2 -> ST3[morphism = MORPH] ST2 -> ST3[morphism = MORPH]
ST3 -> ST4[morphism = MORPH] ST21 -> ST31, ST312[morphism =(MORPH1,MORPH2)]
ST4 -> __END__ ST3, ST31, ST312 -> ST4[morphism = (MORPH,MORPH1,MORPH2) ]
ST4 -> ST1, __END__
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment