NewParser.py 7.1 KB

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