Использование Ply с iPython/Jupyter

Я работаю над проектом, который использует инструмент анализа слоев. Мне нужно реализовать проект в iPython, но, как видно из этого поста проблемы с PLY LEX и YACC, ply вызывает проблемы с инструментом. Таким образом, я хотел знать, есть ли исправление или обходной путь для проблемы, который позволит мне использовать ply и инструмент для ноутбука одновременно.


person Bob Marley    schedule 04.04.2016    source источник
comment
Из вопроса, на который вы ссылались: Ply настаивает на том, чтобы грамматика была модулем, а это значит, что она должна быть в файле. Блокнот IPython не является файлом. Я полагаю, вы можете попробовать сохранить грамматику в виде файла где-нибудь в вашей системе и импортировать ее в блокнот.   -  person Akshat Mahajan    schedule 04.04.2016
comment
@AkshatMahajan Для ясности: блокнот — это файл (.ipynb), а не модуль.   -  person Thomas K    schedule 04.04.2016


Ответы (1)


Возможно, я немного опоздал с ответом, но я только что столкнулся с той же проблемой и сумел найти обходной путь.

Для создания лексера PLY требуется переменная с именем __file__. Итак, прежде чем вызывать lex.lex(), вы должны установить __file__ на имя файла вашей записной книжки.

Например:

[...]
__file__ = "My_Notebook.ipynb"
lexer = lex.lex()
[...]

И если вы используете класс (следуя этому примеру):

class MyLexer(object):
    # [...]
    # lots and lots of token declarations
    # [...]

    # Build the lexer
    def build(self,**kwargs):
        self.lexer = lex.lex(module=self, **kwargs)

my_lexer = MyLexer()
__file__ = "My_Notebook.ipynb"
my_lexer.build()

Также вы не должны определять более одного лексера в файле блокнота, как указано в документации PLY в конце раздела 4.15.

Теперь, чтобы использовать yacc в блокноте IPython/Jupyter, вы должны вызывать его следующим образом:

parser = yacc.yacc(write_tables=False)
person Niteck    schedule 16.02.2018