Exemplo n.º 1
0
class GrammarObject(object):
    def __init__(self, rules):
        '''
        @param rules: a list of grammar rules in tokenized form i.e. grammar rules as token streams.
        '''
        self.rules = rules
        self.langlet = GrammarLanglet()
        self.nfagenerator = None
        self.langlet.langlet_id = ls_grammar.langlet_id
        self.grammar      = ""

    def set_langlet_id(self, ll_id):
        self.langlet.langlet_id = ll_id

    def create_grammar(self, report = False, expansion = True):
        symobject = SymbolObject(self.langlet.langlet_id)
        R = [' '.join([g[1] for g in R1]).strip() for R1 in self.rules]
        symobject.create(R)
        self.langlet.parse_symbol = self.langlet.symbol = symobject
        self.nfagenerator = NFAGenerator(self.langlet, "Parser")
        self.grammar = "\n".join(R)+"\n"
        # print grammar
        self.nfagenerator.create_all(self.grammar)
        if self.nfagenerator.nfas:
            self.nfagenerator.derive_properties()
            if expansion:
                self.nfagenerator.expand_nfas(report = report)
        self.langlet.parse_nfa = self.nfagenerator.nfadata
        self.langlet.keywords  = self.langlet.parse_nfa.keywords

    def get_nfas(self):
        return self.nfagenerator.nfas

    def get_start_symbol(self):
        return self.nfagenerator.nfadata.start_symbols[0]


    @classmethod
    def grammar_from_rule(cls, grammar_rule, report = False):
        rules = []
        R = ls_grammar.tokenize(grammar_rule)
        rules.append(R)
        names = set()
        strings = set()
        for t in R[2:]:
            if t[0] == ls_grammar.parse_token.NAME:
                names.add(t[1])
            elif t[0] == ls_grammar.parse_token.STRING:
                strings.add(t[1])
        for i,name in enumerate(names):
            n = 1
            k = str(i)*n
            while (name+k in names or "'"+name+k+"'" in strings):
                n+=1
                k = str(i)*n

            rules.append(ls_grammar.tokenize("%s: '%s'"%(name, name+k)))
        go = GrammarObject(rules)
        go.create_grammar(report = report)
        return go
Exemplo n.º 2
0
class GrammarObject(object):
    def __init__(self, rules):
        '''
        @param rules: a list of grammar rules in tokenized form i.e. grammar rules as token streams.
        '''
        self.rules = rules
        self.langlet = GrammarLanglet()
        self.nfagenerator = None
        self.langlet.langlet_id = ls_grammar.langlet_id
        self.grammar = ""

    def set_langlet_id(self, ll_id):
        self.langlet.langlet_id = ll_id

    def create_grammar(self, report=False, expansion=True):
        symobject = SymbolObject(self.langlet.langlet_id)
        R = [' '.join([g[1] for g in R1]).strip() for R1 in self.rules]
        symobject.create(R)
        self.langlet.parse_symbol = self.langlet.symbol = symobject
        self.nfagenerator = NFAGenerator(self.langlet, "Parser")
        self.grammar = "\n".join(R) + "\n"
        # print grammar
        self.nfagenerator.create_all(self.grammar)
        if self.nfagenerator.nfas:
            self.nfagenerator.derive_properties()
            if expansion:
                self.nfagenerator.expand_nfas(report=report)
        self.langlet.parse_nfa = self.nfagenerator.nfadata
        self.langlet.keywords = self.langlet.parse_nfa.keywords

    def get_nfas(self):
        return self.nfagenerator.nfas

    def get_start_symbol(self):
        return self.nfagenerator.nfadata.start_symbols[0]

    @classmethod
    def grammar_from_rule(cls, grammar_rule, report=False):
        rules = []
        R = ls_grammar.tokenize(grammar_rule)
        rules.append(R)
        names = set()
        strings = set()
        for t in R[2:]:
            if t[0] == ls_grammar.parse_token.NAME:
                names.add(t[1])
            elif t[0] == ls_grammar.parse_token.STRING:
                strings.add(t[1])
        for i, name in enumerate(names):
            n = 1
            k = str(i) * n
            while (name + k in names or "'" + name + k + "'" in strings):
                n += 1
                k = str(i) * n

            rules.append(ls_grammar.tokenize("%s: '%s'" % (name, name + k)))
        go = GrammarObject(rules)
        go.create_grammar(report=report)
        return go
Exemplo n.º 3
0
class GrammarObject(object):
    def __init__(self, rules):
        self.rules = rules
        self.langlet = GrammarLanglet()
        self.nfagenerator = None

    def create_grammar(self):
        symobject = SymbolObject(ls_grammar.langlet_id)
        R = [' '.join([g[1] for g in R1]).strip() for R1 in self.rules]
        symobject.create(R)
        self.langlet.parse_symbol = symobject
        self.nfagenerator = NFAGenerator(self.langlet, "Parser")
        self.nfagenerator.create_all("\n".join(R)+"\n")
        if self.nfagenerator.nfas:
            self.nfagenerator.derive_properties()
            self.nfagenerator.expand_nfas()