Как построить препроцессорное решение с Tatsu?

Я пишу транспортер для кода Tiny C в код Python, но мне нужно построить решение препроцессора, чтобы заменить #define и управляйте директивой C компилятора (#ifdef, #else, #define...)

Я решил использовать модуль pcpp в Python, но безуспешно... возможно ли решение в полном решении Tatsu?

0 ответов

Части TatSu, поддерживающие предварительную обработку, к сожалению, не документированы.

Вы можете посмотреть, как Buffer.include() реализован, заменяя исходные строки и информацию о строках теми из блока, созданного преобразованием.

def include(self, lines, index, i, j, name, block, **kwargs):
        blines, bindex = self._preprocess_block(name, block, **kwargs)
        assert len(blines) == len(bindex)
        lines[i:j] = blines
        index[i:j] = bindex
        assert len(lines) == len(index)
        return j + len(blines) - 1

По сути, вы можете подключиться к методам предварительной обработки своими собственными Bufferclass и преобразовать текст любым способом. Правильный списокLineIndexInfo позволит синтаксическому анализатору сообщать об ошибках по исходным строкам.

Для препроцессора с макросами вам, вероятно, понадобится синтаксический анализатор для препроцессора и синтаксический анализатор для основного языка. Хитрость заключается в том, чтобы первый синтаксический анализатор сохранял информацию о строке для второго.

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

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