Exemplo n.º 1
0
 def load(self, ptree):
     for stmt in ptree:
         if stmt == 'Rule':
             name = str(stmt.name)
             if name in self.names:
                 # pos4 = stmt['name'].getpos4()
                 console.perror(stmt.name, f'redefined name {name}')
                 continue
             self.names[name] = stmt.e
         elif stmt == 'Example':
             doc = stmt.doc
             for n in stmt.names:
                 self.example(str(n), doc)
         # elif stmt == 'Import':
         #     urn = str(stmt.name)
         #     apeg = grammar(urn, **options)
         #     for n in stmt.names:
         #         lname = str(n)  # ns.Expression
         #         name = lname
         #         if lname.find('.') != -1:
         #             name = lname.split('.')[-1]
         #         pos4 = n.getpos4()
         #         if not name in apeg:
         #             logger('perror', pos4, f'undefined name {name}')
         #             continue
         #         g.add(lname, Action(apeg.newRef(name),
         #                             'import', (name, urn), pos4))
     for name in self.names:
         ptree = self.names[name]
         self.peg[name] = self.conv(ptree)
Exemplo n.º 2
0
 def Quoted(self, ptree):
     name = ptree.getToken()
     if name in self.names:
         ref = self.peg.newRef(name)
         return PName(ref, ref.uname(), ptree)
     console.pwarn(ptree, f'undefined terminal {console.bold(name)}')
     name = name[1:-1]
     return self.newRef(name)
Exemplo n.º 3
0
 def Name(self, ptree):
     name = ptree.getToken()
     if name in self.names:
         ref = self.peg.newRef(name)
         return PName(ref, ref.uname(), ptree)
     if name in BuiltIn_NonTerminal:
         return self.newRef(name)
     if name[0].isupper() or name.startswith('_'):  # or name[0].islower() :
         console.perror(ptree,
                        f'undefined nonterminal {console.bold(name)}')
         self.peg[name] = EMPTY
         return self.peg.newRef(name)
     console.pwarn(ptree, f'undefined nonterminal {console.bold(name)}')
     return self.newRef(name)
Exemplo n.º 4
0
def load_grammar(peg, file_or_text, **options):
    # pegparser = pasm.generate(options.get('peg', TPEGGrammar))

    if isinstance(file_or_text, Path) and file_or_text.is_file():
        f = file_or_text.open(encoding=options.get('encoding', 'utf-8_sig'))
        data = f.read()
        f.close()
        ptree = TPEGParser(data, options.get('urn', file_or_text))
        basepath = str(file_or_text)
    else:
        if 'basepath' in options:
            basepath = options['basepath']
        else:
            basepath = inspect.currentframe().f_back.f_code.co_filename
        ptree = TPEGParser(file_or_text, options.get('urn', basepath))
        basepath = (str(Path(basepath).resolve().parent))
    options['basepath'] = basepath
    if ptree.isSyntaxError():
        console.perror(ptree, 'Syntax Error')
        return
    pconv = TPEGLoader(peg, **options)
    pconv.load(ptree)
Exemplo n.º 5
0
def parsec(peg, **options):
    generator = PAsmGenerator(**options)
    if 'format' in options:
        format = options['format']
        if format not in CODE:
            names = sorted(CODE.keys())
            print(console.bold('Supported format:'), ' '.join(names))
            return
        spec = CODE[format]
        generator.setup(spec)
        generator.generate(peg, **options)
        output(spec)
    else:
        generator.generate(peg, **options)
Exemplo n.º 6
0
 def PName(self, pe: PName, step):
     if step == 0 and self.generating_nonterminal == pe.e.uname(self.peg):
         console.perror(pe.position, 'Left recursion')
         return self.emit(FAIL, step)
     return self.PRef(pe.e, step)
Exemplo n.º 7
0
def version():
    print(DefaultConsole.bold('PEGTree - A PEG Parser Generator with Tree Annotation'))