NewParser.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. from pyparsing import *
  2. import TestScripts.Parser as p
  3. import pickle
  4. def loadRoot(f):
  5. root = None
  6. with open(f,"rb") as inf:
  7. root=pickle.load(inf)
  8. return(root)
  9. class Params:
  10. def __init__(self):
  11. self.full = []
  12. self.summary=None
  13. self.paramNames = None
  14. self.formula=""
  15. def __str__(self):
  16. return(str(self.full) + str(self.summary) + str(self.paramNames))
  17. def disabled(a):
  18. return((CaselessKeyword("disabled") + "{" + a + "}") ^ a)
  19. def parsedNodeDesc( str, loc, toks ):
  20. d={}
  21. if "class" in toks:
  22. d["class"]=toks["class"]
  23. if "folder" in toks:
  24. d["folder"]=toks["folder"]
  25. return(d)
  26. def parseNodeSuite( str, loc, toks):
  27. d={}
  28. t = p.TreeElem(0)
  29. if "message" in toks:
  30. d["message"]=toks["message"]
  31. if "class" in toks["desc"]:
  32. d["class"] = toks["desc"]["class"]
  33. if "folder" in toks["desc"]:
  34. t.setPath(toks["desc"]["folder"])
  35. d["deprecated"] = False
  36. if(toks[0]=="disabled"):
  37. d["deprecated"] = True
  38. if "PARAMID" in toks:
  39. d["PARAMID"] = toks["PARAMID"]
  40. t.writeData(d)
  41. if "params" in toks:
  42. t.params=toks["params"]
  43. for c in toks["allTests"]:
  44. t.addGroup(c)
  45. if "allPatterns" in toks:
  46. for c in toks["allPatterns"]:
  47. t.addPattern(c["ID"],c["path"])
  48. if "allParams" in toks:
  49. for c in toks["allParams"]:
  50. if "path" in c:
  51. t.addParam(p.TreeElem.PARAMFILE,c["ID"],c["path"])
  52. if "numberList" in c:
  53. #print(c["numberList"])
  54. t.addParam(p.TreeElem.PARAMGEN,c["ID"],c["numberList"])
  55. if "allOutputs" in toks:
  56. for c in toks["allOutputs"]:
  57. t.addOutput(c["ID"],c["path"])
  58. return(t)
  59. def parseNodeGroup( str, loc, toks):
  60. d={}
  61. t = p.TreeElem(0)
  62. if "message" in toks:
  63. d["message"]=toks["message"]
  64. if "class" in toks["desc"]:
  65. d["class"] = toks["desc"]["class"]
  66. if "folder" in toks["desc"]:
  67. t.setPath(toks["desc"]["folder"])
  68. d["deprecated"] = False
  69. if(toks[0]=="disabled"):
  70. d["deprecated"] = True
  71. t.writeData(d)
  72. #print(t.data["message"])
  73. for c in toks["contained"]:
  74. #print(" ",c.data["message"])
  75. t.addGroup(c)
  76. return(t)
  77. def parseTest( str, loc, toks):
  78. d={}
  79. if "message" in toks:
  80. d["message"]=toks["message"]
  81. if "class" in toks:
  82. d["class"] = toks["class"]
  83. d["deprecated"] = False
  84. if(toks[0]=="disabled"):
  85. d["deprecated"] = True
  86. if "PARAMID" in toks:
  87. d["PARAMID"] = toks["PARAMID"]
  88. if "testData" in toks:
  89. d["testData"]=toks["testData"]
  90. t = p.TreeElem(0)
  91. t.writeData(d)
  92. return(t)
  93. def getInteger( str, loc, toks):
  94. return(int(toks[0]))
  95. def parseFile( str, loc, toks):
  96. d={}
  97. d["ID"] = toks["ID"]
  98. d["path"] = toks["path"]
  99. return(d)
  100. def parseParamDesc( str, loc, toks):
  101. d={}
  102. d["ID"] = toks["ID"]
  103. if "path" in toks:
  104. d["path"] = toks["path"]
  105. if "numberList" in toks:
  106. d["numberList"] = toks["numberList"]
  107. return(d)
  108. def parseParams( str, loc, toks):
  109. p = Params()
  110. p.full = toks["full"]
  111. if "summary" in toks:
  112. p.summary=toks["summary"]
  113. if "names" in toks:
  114. p.paramNames=[x.strip("\"") for x in toks["names"]]
  115. if "formula" in toks:
  116. p.formula=toks["formula"].strip("\"")
  117. return(p)
  118. def generatorDesc( str, loc, toks):
  119. d={}
  120. r = list(toks["ints"])
  121. d["NAME"] = toks["PARAM"]
  122. d["INTS"] = r
  123. return(d)
  124. def parseTestFields( str, loc, toks):
  125. if "fields" in toks:
  126. fields = toks["fields"]
  127. # merge list of dictionnaries into a dictionnary
  128. newFields = dict((key,d[key]) for d in fields for key in d)
  129. return(newFields)
  130. def parseField( str, loc, toks):
  131. if toks[0] == "oldID":
  132. return({"oldID" : int(toks[2])})
  133. if toks[0] == "truc":
  134. return({"truc" : int(toks[2])})
  135. class Parser:
  136. def __init__(self):
  137. self.id = 0
  138. def parse(self, filePath):
  139. string = Word(alphanums+"_ =+()")
  140. ident = Word( alphas+"_", alphanums+"_" )
  141. path = Word(alphanums+"_/.")
  142. folder = CaselessKeyword("folder") + "=" + path("folder")
  143. nodeDesc = CaselessKeyword("class") + "=" + ident("class") + Optional(folder)
  144. nodeDesc = nodeDesc.setParseAction(parsedNodeDesc)
  145. patterns = (Keyword("Pattern") + ident("ID") + ":" + path("path")).setParseAction(parseFile)
  146. output = (Keyword("Output") + ident("ID") + ":" + path("path")).setParseAction(parseFile)
  147. integer = Combine( Optional(Word("+-")) + Word(nums) ).setParseAction(getInteger)
  148. numberList = (ident("PARAM") + Literal("=") + "[" + delimitedList(integer,",")("ints") + "]").setParseAction(generatorDesc)
  149. generator = Literal("=") + "{" + OneOrMore(numberList)("numberList") + "}"
  150. fileOrGenerator = (":" + path("path")) | generator
  151. params = (Keyword("Params") + ident("ID") + fileOrGenerator).setParseAction(parseParamDesc)
  152. paramValue = Literal("->") + ident("PARAMID")
  153. messFormat = Word(alphanums + " _/")
  154. message = messFormat("message")
  155. testField = ((Keyword("oldID") + "=" + integer("INT")) | (Keyword("truc") + "=" + integer("INT"))).setParseAction(parseField)
  156. testData = (Literal("{") + OneOrMore(testField)("fields") + Literal("}")).setParseAction(parseTestFields)
  157. test = disabled((string("message") + ":" + ident("class") + Optional(testData("testData")) + Optional(paramValue))).setParseAction(parseTest)
  158. # paramDescription =
  159. # File or
  160. # List of int or
  161. # Cartesian products of list
  162. # Can be applied to global pattern
  163. # or on a per test basis
  164. paramDescription = ""
  165. full = delimitedList(ident,",")
  166. formula = Keyword("Formula") + dblQuotedString("formula")
  167. paramNames = Keyword("Names") + delimitedList(dblQuotedString,",")("names")
  168. summary = Keyword("Summary") + delimitedList(ident,",")("summary")
  169. paramDetails = full("full") + Optional(summary) + Optional(paramNames)+ Optional(formula)
  170. paramDesc=Keyword("ParamList") + Literal("{") + paramDetails + Literal("}")
  171. allTests = Keyword("Functions") + "{" + OneOrMore(test)("allTests") + "}" + Optional(paramValue)
  172. allPatterns = ZeroOrMore(patterns)
  173. allOutputs = ZeroOrMore(output)
  174. allParams = ZeroOrMore(params)
  175. paramList = Optional(paramDesc("params").setParseAction(parseParams))
  176. suiteDesc = paramList + allPatterns("allPatterns") + allOutputs("allOutputs") + allParams("allParams") + allTests
  177. suite = disabled(CaselessKeyword("suite") + message + Literal("{") + nodeDesc("desc") + suiteDesc + Literal("}"))
  178. suite = suite.setParseAction(parseNodeSuite)
  179. group = Forward()
  180. contained = OneOrMore(group | suite)
  181. group << disabled(CaselessKeyword("group") + message + Literal("{") + nodeDesc("desc") + contained("contained") + Literal("}"))
  182. group=group.ignore(cStyleComment | ("//" + restOfLine ))
  183. group = group.setParseAction(parseNodeGroup)
  184. tree = group.parseFile( filePath )
  185. tree[0].classify()
  186. # We compute ID of all nodes.
  187. tree[0].computeId()
  188. tree[0].reident(0)
  189. return(tree[0])