XTEXT: правило для инструкций препроцессора - PullRequest
0 голосов
/ 13 июля 2011

Я пытаюсь написать правило для инструкций препроцессора в XText.в настоящее время я реализовал его следующим образом:

preproc:
    type=PREPROCESSOR_INCLUDE_TYPE val=(STRING | PREPROCESSOR_INCLUDE_VAL)| 
    type=PREPROCESSOR_DEFINE_TYPE | 
    type=PREPROCESSOR_SINGLE_PARAM_TYPE val=ID|
    type=PREPROCESSOR_NONE_PARAM_TYPE
;


terminal PREPROCESSOR_INCLUDE_TYPE: '#include'| '#import';

terminal PREPROCESSOR_INCLUDE_VAL: ' '+ '<'->'>';

terminal PREPROCESSOR_DEFINE_TYPE: '#define' -> '\n';

terminal PREPROCESSOR_SINGLE_PARAM_TYPE: '#undef' |'#ifdef' |'#ifndef' |'#pragma';

terminal PREPROCESSOR_NONE_PARAM_TYPE: '#else' | '#endif';

Мне не очень нравится это решение, но оно единственное, которое работает из всех, которые я пробовал.Есть более разумный способ написать правило для инструкций препроцессора?

Как можно разделить правило PREPROCESSOR_DEFINE_TYPE, чтобы отделить тип инструкции препроцессора (#define) от его значения?

большое спасибо

РЕДАКТИРОВАТЬ

то, что я хочу описать с помощью этих правил, - это типичные инструкции препроцессора.Например:

#include "fileName"
#import <fileName>

#define IDENTIFIER
#define IDENTIFIER WHATEVER + YOU - WANT !

#undef IDENTIFIER

#else
#endif

Было бы неплохо отделить тип препроцессора от его значения во всех различных случаях

Raffaello.

Ответы [ 2 ]

1 голос
/ 17 июля 2014

По сути, вы не можете (из коробки) создавать языки, которые выполняют предварительную обработку с помощью XText.XText генерирует код для одной грамматики.Предварительная обработка требует 2 подходящих грамматики.

Вот вызовы http://www.eclipse.org/forums/index.php/mv/msg/366839/894493/#msg_894493

Подумайте над примером:

a = 1 
#ifdef something
    +1
#endif
;

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

0 голосов
/ 14 июля 2011

Если я понимаю ваш вопрос, вам нужен узел AST для определения правил, который имеет атрибут с остальной частью правила, но не содержит ключевое слово #define.

Проблема с *Правило 1004 * или правила возможного отрицания (!) заключаются в том, что они вызывают конфликты с символами пробела между #define и инструкцией, что не может быть легко решено.

Однако вы можетеопределите новый терминал, который начинается, например, с буквы или _ и заканчивается символом новой строки, который может быть добавлен к вашему языку, следующим образом:

PREPROCESSOR_DEFINE_TYPE: '#define' instruction=Content 
;

terminal Content:
    ('a'..'z'|'A'..'Z'|'_') -> '\n'
;

Я не тестировал решение,но он не выдает ошибок в моем редакторе Xtext и очень похож на определение параметров ID из Terminals.xtext, поэтому я считаю, что оно должно быть близко к тому, что вам нужно.

Кроме того, я не думаю,вы должны определить все типы препроцессоров как терминалы, так как они станут намного более низкоуровневыми конструкциями;Я бы определил как можно больше их как нетерминальных правил.

...