コード例 #1
0
ファイル: parser.py プロジェクト: blamedcloud/ParserTongue
class Parser(object):
    def __init__(self,
                 grammarFile,
                 startIdentifier=None,
                 dependentGrammarFiles=None):
        self.alphabet = None
        self.ttl = None
        self.grammar = Grammar(grammarFile,
                               startSym=startIdentifier,
                               deferLinkage=True)
        if self.grammar.hasDependencies():
            manageDependencies(self.grammar, grammarFileToName(grammarFile),
                               dependentGrammarFiles)
        else:
            self.grammar.setExternalRuleDicts({})
            self.grammar.linkRules()
        if not self.grammar.hasLinked():
            raise GrammarLinkError("Grammar was never linked. Aborting.")
        self.setGrammarAlphabet()

    def setTTL(self, ttl):
        self.ttl = ttl

    def setAlphabet(self, alphabet):
        self.alphabet = alphabet
        self.ttl = getTTLForAlphabet(self.alphabet)

    def setGrammarAlphabet(self):
        self.alphabet = self.grammar.getAlphabet()
        alphabetTTL = getTTLForAlphabet(self.alphabet)
        if self.grammar.hasRegExTTs():
            self.ttl = self.grammar.getRegExTTs()
            self.ttl.extendWith(alphabetTTL)
        else:
            self.ttl = alphabetTTL

    def setRuleTransform(self, ruleName, f):
        self.grammar.setRuleTransformer(ruleName, f)

    def getGrammar(self):
        return self.grammar

    def checkFile(self, objFile, ignoreWS=False, debug=False):
        return bool(self.parseFile(objFile, ignoreWS, debug))

    def parseFile(self, objFile, ignoreWS=False, debug=False):
        raw = ''
        with open(objFile) as FILE:
            for line in FILE:
                raw += line
        return self.parseRaw(raw, ignoreWS, debug)

    def checkRaw(self, raw, ignoreWS=False, debug=False):
        return bool(self.parseRaw(raw, ignoreWS, debug))

    def parseRaw(self, raw, ignoreWS=False, debug=False):
        tokens = Tokenizer(self.ttl, ignoreWS)
        tokens.tokenize(raw)
        obj = self.grammar.tryMatch(tokens, debug)
        if obj:
            return obj.getArgs()
        else:
            return obj.getError()