2015-09-19 1 views
1

Вопрос: Я хотел бы иметь блок выполнения в моей грамматике, который позволяет использовать любую допустимую строку java (или любую строку, это тоже будет хорошо) в пределах своих границ:Как разрешить строку Java-кода в грамматике Xtext

Execution: 
    {Execution} 'execute {' 
    (lines+=(JavaLine | Referral))* 
    '}' 
; 

Referral: 
    inReferal | outReferal 
; 

inReferal: 
    name=ID '<=' port=ID 
; 

outReferal: 
    name=ID '=>' port=ID 
; 

JavaLine: 
    {JavaLine}(words+=ID)* ';' // this doesn't fit quite its needs, no . - { etc allowed 
;  

Это соответствующая часть грамматики, как бы я должен построить JavaLine для того, чтобы получить какую-либо строку?

Бонус Вопрос: У меня есть другие правила, такие как OutPort или Parameter, как я могу предотвратить их использование в моем блоке выполнения? (Я получаю синтаксис выделен из ключевых слов в пределах моих ява линий)

Model: 
    stages+=Stage*; 

Stage: 
    'stage' name=ID (('implements' interfaces=List)? & ('extends' extension=ID)?) '{' 
     lines+=StageItems* 
    '}'; 

List: items+=ID (',' items+=ID)*; 

StageItems: 
    InPort | OutPort | Parameter | Execution 
; 

Parameter: 
    'param' type=ID name=ID 
; 

InPort: 
    'in' type=ID name=ID 
; 

OutPort: 
    'out' type=ID name=ID 
;  

ответ

0

Я закончил с использованием этого:

Execution: 
    content=JAVA_LINE 
; 

terminal JAVA_LINE: 
    'execute' 
    '{'->'}' // TODO: this doesn't fit quite its needs 
; 

для генерации кода я должен был удалить некоторое содержимое из строки содержимого, но все остальное работает нормально.

0

Первый вопрос:

Одна возможность определить его как строку вместо списка слов (с удостоверением). Вы можете позже преобразовать строку в Java Code в процесс генерации.

JavaLine: 
    {JavaLine}(words=STRING)* ';' 
; 

Второй вопрос:

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

1

Код Java не организован в строках. Технически почти любая строка приемлема как исходный код Java, потому что вы можете поставить многострочный комментарий в источнике Java.

Если абстрагироваться от линии концепции, вы можете разобрать источник Java с помощью Java Grammar (Java7) или Java Grammar (Java8) - это довольно большая работа.

Возможно, проще, если вы только реализуете Блок grammar (see here) - представляющий исполняемый блок на Java. Это меньше работает.

Если вы хотите, чтобы один-лайнер кода Java только (с сохранением линии понятием), вы можете сосредоточиться на Заявление уровня, собирание разрешенных выписок-типов (например, нет определения подкласса, без этикеток и т.д.)

+0

Спасибо за ваш ответ. Могу ли я каким-то образом импортировать существующую java-грамматику? Единственное, что я хотел бы сделать, это полностью скопировать содержимое в блок выполнения. –