Я пытаюсь реализовать парсер python, используя PLY для языка Kconfig, используемого для создания параметров конфигурации для ядра Linux.
Есть ключевое слово source, которое выполняет включение, поэтому я делаю следующее: когда лексер встречает это ключевое слово, я изменяю состояние лексера, чтобы создать новый лексер, который будет лексировать исходный файл:
def t_begin_source(t):
r'source '
t.lexer.begin('source')
def t_source_path(t):
r'[^\n]+\n+'
t.lexer.begin('INITIAL')
global path
source_lexer = lex.lex(errorlog=lex.NullLogger())
source_file_name = (path + t.value.strip(' \"\n'))
sourced_file = file(path + t.value.strip(' \"\n')).read()
source_lexer.input(sourced_file)
while True:
tok = source_lexer.token()
if not tok:
break
Где-то еще у меня есть эта строка
lexer = lex.lex(errorlog=lex.NullLogger())
Это «основной» или «корневой» лексер, который будет вызываться синтаксическим анализатором.
Моя проблема в том, что я не знаю, как сказать синтаксическому анализатору использовать другой лексер или сказать "source_lexer" что-то вернуть...
Возможно, следует использовать функцию клонирования...
Спасибо