Проблема с несколькими заданиями легко решается в грамматике.Просто разрешите множественные присваивания:
assign_stmt = 'assign' assignments '.' ;
assignements = ;
assignments = assignments target '=' expression ;
Один из методов, который вы можете использовать, - это дополнить грамматику, чтобы разрешить последовательности токенов препроцессора везде, где может быть разрешен нетерминал, и просто не выполнять расширение препроцессора.Для вашего примера у вас есть грамматическое правило:
expression = ... ;
, просто добавьте правило:
expression = '{' include_reference '}' ;
Это работает в той степени, в которой препроцессор не используется для создания нескольких языков.элементы, которые выходят за нетерминальные границы.
Какой анализ кода вы намереваетесь сделать?В значительной степени, чтобы сделать что-нибудь, вам нужно будет указать имя и тип разрешения, что потребует расширения директив препроцессора.В этом случае вам понадобится более сложная схема, потому что вам нужно расширенное дерево для разрешения имен и информация о включении, связанная со стороной.
Наш инструментарий реинжиниринга программного обеспечения DMS имеет анализатор OpenEdge, в котором мы представляем предыдущий трюк "сохранить ссылки на включаемый файл".Синтаксический анализатор DMS C добавляет «макро узел» к дереву, где макро (OpenEdge «включить» - просто забавный способ написать определение макроса) дочерние узлы содержат дерево, как вы ожидаете, и справочную информацию, которая ссылается намакроопределение.Это требует некоторой тщательной организации и множества специальных операций с макроузлами, где они происходят.