Как сохранить состояние Bison при разборе кусков разных потоков?

У меня есть одно определение синтаксического анализатора Bison для применения к нескольким потокам. Каждый поток создается порциями через определенные интервалы, поэтому я хотел бы сохранить состояние данного экземпляра синтаксического анализа, чтобы переключаться между различными потоками, сохраняя при этом состояние (с соответствующими стеками) каждого экземпляра синтаксического анализа.

Я знаю, что есть возможность переключаться между несколькими буферами со сканера, но это не помогает мне создавать различное дерево синтаксического анализа для каждого анализируемого потока.

Есть ли какая-либо функция Bison, которая позволяет выполнять какую функцию yy_switch_to_buffer() делает в flex?

1 ответ

Решение

Я думаю, что вы ищете чистый (реентерабельный) интерфейс парсера, который позволяет вам поддерживать отдельные состояния парсера. Вы, вероятно, также захотите использовать реентерабельный лексер flex, чтобы у каждого состояния синтаксического анализатора было свое собственное состояние лексера. (Вы можете использовать один лексер и переключать буферы каждый раз, когда вы вызываете его, но интерфейс реентерабельного лексера намного чище и более общий, поскольку он сохраняет все состояния лексера, включая, например, начальное условие и стеки буфера.)

Другие вопросы по тегам