コード例 #1
0
    def parse(self, rules, file, dumpLine=False, defaultRule=None):
        self.parseContext.rules = rules_to_dict(rules, defaultRule)

        with LineParser(file) as lines:
            defaultIdSize = 1
            # the first line is not allowed to be comment line or empty but must be the header
            if hasattr(self, "parseHeader"):
                try:
                    self.parseHeader(next(lines))
                except ParseError as e:
                    e.line = lines.iter.getLine()
                    raise e
                except StopIteration:
                    raise ParseError("Expected Header.")

            for words in lines:
                if dumpLine:
                    print(
                        "line %03d: %s" % (lines.iter.getLine(),
                                           lines.iter.getLineText().rstrip()))

                ruleId = self.getRuleId(words)
                if ruleId is not None:
                    try:
                        rule = self.parseContext.rules[ruleId]
                    except KeyError as e:
                        rule = self.parseContext.rules.get("", None)
                        if rule is not None:
                            words.putback(ruleId)
                        else:
                            raise ValueError("Unsupported rule '%s'" %
                                             (ruleId))

                    step = rule.parse(words, self.parseContext.context)
                    step.lineInFile = lines.iter.getLine()
                    yield step

                    self.parseContext = step.newParseContext(self.parseContext)
                    numConstraints = step.numConstraints()
                    if numConstraints > 0:
                        oldFree = self.parseContext.firstFreeId
                        newFree = oldFree + numConstraints
                        self.parseContext.firstFreeId = newFree
                        for listener in self.parseContext.addIneqListener:
                            listener(range(oldFree, newFree),
                                     self.parseContext.context)
コード例 #2
0
 def allowedRules(self, context, currentRules):
     return rules_to_dict(self.subRules)
コード例 #3
0
 def allowedRules(self, context, currentRules):
     self.subContext.previousRules = currentRules
     return rules_to_dict(self.subRules)
コード例 #4
0
 def allowedRules(self, context, currentRules):
     if not self.autoProoved:
         self.subContext.previousRules = currentRules
         return rules_to_dict(self.subRules)
     else:
         return currentRules