Skip to content

Python3 lexer file has implicit relative import of parser, which is not supported by Python3 #3230

@SkittlePox

Description

@SkittlePox

When antlr4 generates python3 lexer and parser files, it uses an implicit relative import of the parser from the lexer file:

# RLangLexer.py
...
from RLangParser import RLangParser
...

Apparently, this kind of import is a no-go for Python3, and at least pytest breaks when a test uses an imported file which itself tries to make an implicit relative import. The solution is simple, add a period to make it an explicit relative import:

# RLangLexer.py
...
from .RLangParser import RLangParser
...

This makes running pytest possible (and I presume running a listener which uses the lexer from outside the package). However, it breaks pygrun with an ImportError:

...
ImportError: attempted relative import with no known parent package

No fear, a simple fix to thepygrun file which updates the __package__ global with the current working directory allows for pygrun to work with both implicit and explicit relative imports:

# pygrun
102     sys.path.append('.')
103     #print(sys.path)
104     p = os.path.basename(os.getcwd())        # New Code
105     globals().update({'__package__': p})     # New Code
106     
107     # print("Load Lexer {}".format(lexerName))
108     module_lexer = __import__(lexerName, globals(), locals(), lexerName, 1)
109     class_lexer = getattr(module_lexer, lexerName)

I can add the changes to pygrun to support these imports with a pull request, but I'm not sure how to change the initial generation of implicit relative imports in the lexer (which would add a . to the beginning of the parser module) without a post-processing script which adds a .. That would be quite messy. Is there an internal fix?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions