2016-12-21 7 views
0

Я написал парсер, используя PLY, и он делает то, что мне нужно. Теперь я хотел бы проанализировать несколько файлов, используя класс парсера. Вместо того, чтобы создавать экземпляр класса парсера для каждого файла, я хотел бы повторно использовать тот же экземпляр класса для всех файлов (чтобы я мог накапливать некоторые результаты в классе парсеров).re-initializing PLY parser

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

Каков правильный способ повторной инициализации парсера PLY? (? Или я не должен повторно использовать анализатор)

+0

(Отказ от ответственности: я не использую PLY.) Вы можете получить больше ответов, если будете приводить примеры данных, которые вы хотите сохранить, и почему. Если у PLY _does_ есть безопасный метод повторного инициализации, я сомневаюсь, что он оставит _un_-re-initialized точные значения, которые вы хотите сохранить. ... В этом отношении, не лучше ли вам накапливать данные, которые вы хотите сохранить от каждого парсера в словаре, или, может быть, в одном словаре на каждый проанализированный файл? –

+1

Я пишу парсер Verilog и обрабатывает несколько файлов Verilog. Некоторые из них могут содержать ошибки, так что синтаксический анализатор может останавливаться в смешном состоянии, когда файл анализируется. Я подумал, что неплохо было бы повторно использовать парсер, чтобы не было необходимости разрушать объект парсера и строить новый объект парсера. Кроме того, я могу продолжать анализировать результаты из нескольких входных файлов в классе. – user2756376

+0

«Некоторые из них могут содержать ошибки, чтобы синтаксический анализатор мог остановиться в забавном состоянии», в сочетании с «Я могу продолжать анализировать результаты из нескольких входных файлов», похоже, что вы будете смешивать ошибки из первого типа файла с хорошими результатами В секунду. Но я здесь не в своем домене, поэтому я оставлю этот вопрос кому-то еще. Я предлагаю, однако, чтобы вы отредактировали детали из вашего комментария в свой вопрос --- они не будут замечены здесь. –

ответ

1

Если вы хотите использовать один и тот же анализатор для нескольких файлов, но сброса стека каждый раз, вы можете использовать функцию restart:

parser = yacc.yacc() 
for file in file_list: 
    with open(file) as fp: 
     parser.parse(fp.read()) 
     ... # accumulate logging info 
     parser.restart() # this discards the entire parsing stack and resets the parser to its initial state 

Более подробную информацию можно найти на странице official documentation.