| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- from pyparsing import *
- import TestScripts.Parser as p
- import pickle
- def loadRoot(f):
- root = None
- with open(f,"rb") as inf:
- root=pickle.load(inf)
- return(root)
- class Params:
- def __init__(self):
- self.full = []
- self.summary=None
- self.paramNames = None
- self.formula=""
- def __str__(self):
- return(str(self.full) + str(self.summary) + str(self.paramNames))
- def disabled(a):
- return((CaselessKeyword("disabled") + "{" + a + "}") ^ a)
- def parsedNodeDesc( str, loc, toks ):
- d={}
- if "class" in toks:
- d["class"]=toks["class"]
- if "folder" in toks:
- d["folder"]=toks["folder"]
- return(d)
- def parseNodeSuite( str, loc, toks):
- d={}
- t = p.TreeElem(0)
- if "message" in toks:
- d["message"]=toks["message"]
- if "class" in toks["desc"]:
- d["class"] = toks["desc"]["class"]
- if "folder" in toks["desc"]:
- t.setPath(toks["desc"]["folder"])
- d["deprecated"] = False
- if(toks[0]=="disabled"):
- d["deprecated"] = True
- if "PARAMID" in toks:
- d["PARAMID"] = toks["PARAMID"]
-
- t.writeData(d)
- if "params" in toks:
- t.params=toks["params"]
- for c in toks["allTests"]:
- t.addGroup(c)
- if "allPatterns" in toks:
- for c in toks["allPatterns"]:
- t.addPattern(c["ID"],c["path"])
- if "allParams" in toks:
- for c in toks["allParams"]:
- if "path" in c:
- t.addParam(p.TreeElem.PARAMFILE,c["ID"],c["path"])
- if "numberList" in c:
- #print(c["numberList"])
- t.addParam(p.TreeElem.PARAMGEN,c["ID"],c["numberList"])
- if "allOutputs" in toks:
- for c in toks["allOutputs"]:
- t.addOutput(c["ID"],c["path"])
- return(t)
- def parseNodeGroup( str, loc, toks):
- d={}
- t = p.TreeElem(0)
- if "message" in toks:
- d["message"]=toks["message"]
- if "class" in toks["desc"]:
- d["class"] = toks["desc"]["class"]
- if "folder" in toks["desc"]:
- t.setPath(toks["desc"]["folder"])
- d["deprecated"] = False
- if(toks[0]=="disabled"):
- d["deprecated"] = True
-
- t.writeData(d)
- #print(t.data["message"])
- for c in toks["contained"]:
- #print(" ",c.data["message"])
- t.addGroup(c)
- return(t)
- def parseTest( str, loc, toks):
- d={}
- if "message" in toks:
- d["message"]=toks["message"]
- if "class" in toks:
- d["class"] = toks["class"]
- d["deprecated"] = False
- if(toks[0]=="disabled"):
- d["deprecated"] = True
- if "PARAMID" in toks:
- d["PARAMID"] = toks["PARAMID"]
- if "testData" in toks:
- d["testData"]=toks["testData"]
- t = p.TreeElem(0)
- t.writeData(d)
- return(t)
- def getInteger( str, loc, toks):
- return(int(toks[0]))
- def parseFile( str, loc, toks):
- d={}
- d["ID"] = toks["ID"]
- d["path"] = toks["path"]
- return(d)
- def parseParamDesc( str, loc, toks):
- d={}
- d["ID"] = toks["ID"]
- if "path" in toks:
- d["path"] = toks["path"]
- if "numberList" in toks:
- d["numberList"] = toks["numberList"]
- return(d)
-
- def parseParams( str, loc, toks):
- p = Params()
- p.full = toks["full"]
- if "summary" in toks:
- p.summary=toks["summary"]
- if "names" in toks:
- p.paramNames=[x.strip("\"") for x in toks["names"]]
- if "formula" in toks:
- p.formula=toks["formula"].strip("\"")
- return(p)
- def generatorDesc( str, loc, toks):
- d={}
- r = list(toks["ints"])
- d["NAME"] = toks["PARAM"]
- d["INTS"] = r
- return(d)
- def parseTestFields( str, loc, toks):
- if "fields" in toks:
- fields = toks["fields"]
- # merge list of dictionnaries into a dictionnary
- newFields = dict((key,d[key]) for d in fields for key in d)
- return(newFields)
- def parseField( str, loc, toks):
- if toks[0] == "oldID":
- return({"oldID" : int(toks[2])})
- if toks[0] == "truc":
- return({"truc" : int(toks[2])})
- class Parser:
- def __init__(self):
- self.id = 0
- def parse(self, filePath):
- string = Word(alphanums+"_ =+()")
- ident = Word( alphas+"_", alphanums+"_" )
- path = Word(alphanums+"_/.")
- folder = CaselessKeyword("folder") + "=" + path("folder")
- nodeDesc = CaselessKeyword("class") + "=" + ident("class") + Optional(folder)
- nodeDesc = nodeDesc.setParseAction(parsedNodeDesc)
- patterns = (Keyword("Pattern") + ident("ID") + ":" + path("path")).setParseAction(parseFile)
- output = (Keyword("Output") + ident("ID") + ":" + path("path")).setParseAction(parseFile)
-
- integer = Combine( Optional(Word("+-")) + Word(nums) ).setParseAction(getInteger)
- numberList = (ident("PARAM") + Literal("=") + "[" + delimitedList(integer,",")("ints") + "]").setParseAction(generatorDesc)
- generator = Literal("=") + "{" + OneOrMore(numberList)("numberList") + "}"
- fileOrGenerator = (":" + path("path")) | generator
- params = (Keyword("Params") + ident("ID") + fileOrGenerator).setParseAction(parseParamDesc)
- paramValue = Literal("->") + ident("PARAMID")
- messFormat = Word(alphanums + " _/")
- message = messFormat("message")
- testField = ((Keyword("oldID") + "=" + integer("INT")) | (Keyword("truc") + "=" + integer("INT"))).setParseAction(parseField)
- testData = (Literal("{") + OneOrMore(testField)("fields") + Literal("}")).setParseAction(parseTestFields)
- test = disabled((string("message") + ":" + ident("class") + Optional(testData("testData")) + Optional(paramValue))).setParseAction(parseTest)
-
- # paramDescription =
- # File or
- # List of int or
- # Cartesian products of list
- # Can be applied to global pattern
- # or on a per test basis
- paramDescription = ""
- full = delimitedList(ident,",")
- formula = Keyword("Formula") + dblQuotedString("formula")
- paramNames = Keyword("Names") + delimitedList(dblQuotedString,",")("names")
- summary = Keyword("Summary") + delimitedList(ident,",")("summary")
-
- paramDetails = full("full") + Optional(summary) + Optional(paramNames)+ Optional(formula)
- paramDesc=Keyword("ParamList") + Literal("{") + paramDetails + Literal("}")
- allTests = Keyword("Functions") + "{" + OneOrMore(test)("allTests") + "}" + Optional(paramValue)
- allPatterns = ZeroOrMore(patterns)
- allOutputs = ZeroOrMore(output)
- allParams = ZeroOrMore(params)
- paramList = Optional(paramDesc("params").setParseAction(parseParams))
- suiteDesc = paramList + allPatterns("allPatterns") + allOutputs("allOutputs") + allParams("allParams") + allTests
- suite = disabled(CaselessKeyword("suite") + message + Literal("{") + nodeDesc("desc") + suiteDesc + Literal("}"))
- suite = suite.setParseAction(parseNodeSuite)
- group = Forward()
- contained = OneOrMore(group | suite)
-
- group << disabled(CaselessKeyword("group") + message + Literal("{") + nodeDesc("desc") + contained("contained") + Literal("}"))
- group=group.ignore(cStyleComment | ("//" + restOfLine ))
- group = group.setParseAction(parseNodeGroup)
- tree = group.parseFile( filePath )
- tree[0].classify()
- # We compute ID of all nodes.
- tree[0].computeId()
- tree[0].reident(0)
- return(tree[0])
|