Если я понимаю ваш вопрос, вам нужен узел AST для определения правил, который имеет атрибут с остальной частью правила, но не содержит ключевое слово #define
.
Проблема с *Правило 1004 * или правила возможного отрицания (!
) заключаются в том, что они вызывают конфликты с символами пробела между #define
и инструкцией, что не может быть легко решено.
Однако вы можетеопределите новый терминал, который начинается, например, с буквы или _
и заканчивается символом новой строки, который может быть добавлен к вашему языку, следующим образом:
PREPROCESSOR_DEFINE_TYPE: '#define' instruction=Content
;
terminal Content:
('a'..'z'|'A'..'Z'|'_') -> '\n'
;
Я не тестировал решение,но он не выдает ошибок в моем редакторе Xtext и очень похож на определение параметров ID из Terminals.xtext
, поэтому я считаю, что оно должно быть близко к тому, что вам нужно.
Кроме того, я не думаю,вы должны определить все типы препроцессоров как терминалы, так как они станут намного более низкоуровневыми конструкциями;Я бы определил как можно больше их как нетерминальных правил.