Как построить препроцессорное решение с 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
По сути, вы можете подключиться к методам предварительной обработки своими собственными Buffer
class и преобразовать текст любым способом. Правильный списокLineIndexInfo
позволит синтаксическому анализатору сообщать об ошибках по исходным строкам.
Для препроцессора с макросами вам, вероятно, понадобится синтаксический анализатор для препроцессора и синтаксический анализатор для основного языка. Хитрость заключается в том, чтобы первый синтаксический анализатор сохранял информацию о строке для второго.
Препроцессор может работать отдельно, но он должен вводить достаточно метаданных, чтобы основной синтаксический анализатор мог восстановить исходную информацию о строке.