Пример #1
0
def test_generate():
    f = py.path.local(__file__).dirpath().join("pypackrat.py")
    from pypackrat import PyPackratSyntaxParser
    p = PyPackratSyntaxParser(syntax)
    t = p.file()
    t = t.visit(TreeOptimizer())
    visitor = ParserBuilder()
    t.visit(visitor)
    code = visitor.get_code()
    content = """
from rpython.rlib.parsing.tree import Nonterminal, Symbol
from makepackrat import PackratParser, BacktrackException, Status
%s
class PyPackratSyntaxParser(PackratParser):
    def __init__(self, stream):
        self.init_parser(stream)
forbidden = dict.fromkeys(("__weakref__ __doc__ "
                           "__dict__ __module__").split())
initthere = "__init__" in PyPackratSyntaxParser.__dict__
for key, value in Parser.__dict__.iteritems():
    if key not in PyPackratSyntaxParser.__dict__ and key not in forbidden:
        setattr(PyPackratSyntaxParser, key, value)
PyPackratSyntaxParser.init_parser = Parser.__init__.im_func
""" % (code, )
    print content
    f.write(content)
Пример #2
0
def test_generate():
    f = py.path.local(__file__).dirpath().join("pypackrat.py")
    from pypackrat import PyPackratSyntaxParser
    p = PyPackratSyntaxParser(syntax)
    t = p.file()
    t = t.visit(TreeOptimizer())
    visitor = ParserBuilder()
    t.visit(visitor)
    code = visitor.get_code()
    content = """
from pypy.rlib.parsing.tree import Nonterminal, Symbol
from makepackrat import PackratParser, BacktrackException, Status
%s
class PyPackratSyntaxParser(PackratParser):
    def __init__(self, stream):
        self.init_parser(stream)
forbidden = dict.fromkeys(("__weakref__ __doc__ "
                           "__dict__ __module__").split())
initthere = "__init__" in PyPackratSyntaxParser.__dict__
for key, value in Parser.__dict__.iteritems():
    if key not in PyPackratSyntaxParser.__dict__ and key not in forbidden:
        setattr(PyPackratSyntaxParser, key, value)
PyPackratSyntaxParser.init_parser = Parser.__init__.im_func
""" % (code, )
    print content
    f.write(content)
Пример #3
0
 def __new__(cls, name_, bases, dct):
     if '__doc__' not in dct or dct['__doc__'] is None:
         return type.__new__(cls, name_, bases, dct)
     from pypackrat import PyPackratSyntaxParser
     import sys, new, inspect
     frame = sys._getframe(1)
     source = dct['__doc__']
     p = PyPackratSyntaxParser(source)
     try:
         t = p.file()
     except BacktrackException, exc:
         print exc.error.nice_error_message("<docstring>", source)
         lineno, _ = exc.error.get_line_column(source)
         errorline = source.split("\n")[lineno]
         try:
             code = frame.f_code
             source = inspect.getsource(code)
             lineno_in_orig = source.split("\n").index(errorline)
             if lineno_in_orig >= 0:
                 print "probable error position:"
                 print "file:", code.co_filename
                 print "line:", lineno_in_orig + code.co_firstlineno + 1
         except (IOError, ValueError):
             pass
         raise exc
Пример #4
0
 def __new__(cls, name_, bases, dct):
     if '__doc__' not in dct or dct['__doc__'] is None:
         return type.__new__(cls, name_, bases, dct)
     from pypackrat import PyPackratSyntaxParser
     import sys, new, inspect
     frame = sys._getframe(1)
     source = dct['__doc__']
     p = PyPackratSyntaxParser(source)
     try:
         t = p.file()
     except BacktrackException, exc:
         print exc.error.nice_error_message("<docstring>", source)
         lineno, _ = exc.error.get_line_column(source)
         errorline = source.split("\n")[lineno]
         try:
             code = frame.f_code
             source = inspect.getsource(code)
             lineno_in_orig = source.split("\n").index(errorline)
             if lineno_in_orig >= 0:
                 print "probable error position:"
                 print "file:", code.co_filename
                 print "line:", lineno_in_orig + code.co_firstlineno + 1
         except (IOError, ValueError):
             pass
         raise exc
Пример #5
0
    def __new__(cls, name_, bases, dct):
        if '__doc__' not in dct or dct['__doc__'] is None:
            return type.__new__(cls, name_, bases, dct)
        from pypackrat import PyPackratSyntaxParser
        import sys, new, inspect
        frame = sys._getframe(1)
        source = dct['__doc__']
        p = PyPackratSyntaxParser(source)
        try:
            t = p.file()
        except BacktrackException as exc:
            print exc.error.nice_error_message("<docstring>", source)
            lineno, _ = exc.error.get_line_column(source)
            errorline = source.split("\n")[lineno]
            try:
                code = frame.f_code
                source = inspect.getsource(code)
                lineno_in_orig = source.split("\n").index(errorline)
                if lineno_in_orig >= 0:
                    print "probable error position:"
                    print "file:", code.co_filename
                    print "line:", lineno_in_orig + code.co_firstlineno + 1
            except (IOError, ValueError):
                pass
            raise exc
        t = t.visit(TreeOptimizer())
        visitor = ParserBuilder()
        t.visit(visitor)
        pcls = visitor.make_parser()
        forbidden = dict.fromkeys(("__weakref__ __doc__ "
                                   "__dict__ __module__").split())
        initthere = "__init__" in dct

        #XXX XXX XXX
        if 'BacktrackException' not in frame.f_globals:
            raise Exception("must import BacktrackException")
        if 'Status' not in frame.f_globals:
            raise Exception("must import Status")
        result = type.__new__(cls, name_, bases, dct)
        for key, value in pcls.__dict__.iteritems():
            if isinstance(value, type):
                value.__module__ = result.__module__ #XXX help the annotator
            if isinstance(value, type(lambda: None)):
                value = new.function(value.__code__, frame.f_globals)
            if not hasattr(result, key) and key not in forbidden:
                setattr(result, key, value)
        if result.__init__ == object.__init__:
            result.__init__ = pcls.__dict__['__init__']
        result.init_parser = pcls.__dict__['__init__']
        result._code = visitor.get_code()
        return result
Пример #6
0
    def __new__(cls, name_, bases, dct):
        if '__doc__' not in dct or dct['__doc__'] is None:
            return type.__new__(cls, name_, bases, dct)
        from pypackrat import PyPackratSyntaxParser
        import sys, new, inspect
        frame = sys._getframe(1)
        source = dct['__doc__']
        p = PyPackratSyntaxParser(source)
        try:
            t = p.file()
        except BacktrackException as exc:
            print exc.error.nice_error_message("<docstring>", source)
            lineno, _ = exc.error.get_line_column(source)
            errorline = source.split("\n")[lineno]
            try:
                code = frame.f_code
                source = inspect.getsource(code)
                lineno_in_orig = source.split("\n").index(errorline)
                if lineno_in_orig >= 0:
                    print "probable error position:"
                    print "file:", code.co_filename
                    print "line:", lineno_in_orig + code.co_firstlineno + 1
            except (IOError, ValueError):
                pass
            raise exc
        t = t.visit(TreeOptimizer())
        visitor = ParserBuilder()
        t.visit(visitor)
        pcls = visitor.make_parser()
        forbidden = dict.fromkeys(("__weakref__ __doc__ "
                                   "__dict__ __module__").split())
        initthere = "__init__" in dct

        #XXX XXX XXX
        if 'BacktrackException' not in frame.f_globals:
            raise Exception("must import BacktrackException")
        if 'Status' not in frame.f_globals:
            raise Exception("must import Status")
        result = type.__new__(cls, name_, bases, dct)
        for key, value in pcls.__dict__.iteritems():
            if isinstance(value, type):
                value.__module__ = result.__module__ #XXX help the annotator
            if isinstance(value, type(lambda: None)):
                value = new.function(value.func_code, frame.f_globals)
            if not hasattr(result, key) and key not in forbidden:
                setattr(result, key, value)
        if result.__init__ == object.__init__:
            result.__init__ = pcls.__dict__['__init__']
        result.init_parser = pcls.__dict__['__init__']
        result._code = visitor.get_code()
        return result