Как я могу написать ссылку на одну из двух вещей?

Я пишу грамматику Xtext и хочу поддерживать перекрестные ссылки для использования переменных или параметров на моем целевом языке.

Таким образом, целевой язык выглядит примерно так:

function(p1) {
  x1 = eat(p1) // line 1
  x2 = eat(x1) // line 2
}

И для этого я определил:

Instruction:
  name=Value '=' 'eat' '(' ref=[Instruction|Value] ')'

Это работает для строки 2, но не работает для строки 1, потому что параметр не является инструкцией. Я пытался определить это так:

Instruction:
  name=Value '=' 'eat' '(' ref=([Instruction|Value] | [Parameter|Value]) ')'

Или различные варианты этого - например. с использованием единственного правила Ref, которое может быть одной из двух возможных ссылок, но все они отвергаются Xtext. Выполнимо ли это, и если да, то как?

(Я предполагаю, что альтернативой будет определение одного элемента, который представляет и параметр, и инструкцию, а затем ссылка на него, но я не мог понять, как это сделать, не допуская появления синтаксиса или целой инструкции в список параметров)


person Oak    schedule 17.07.2012    source источник


Ответы (2)


Если и инструкция, и параметр имеют общего предка, вы можете написать правило, которое ссылается на этого предка.

Затем вы можете запретить любую другую возможную конфигурацию с помощью некоторой незначительной конфигурации валидатора/помощи содержимого.

Это не самое лучшее решение, так как оно вводит базовый класс, который используется в модели вместо пониженной версии, но я не знаю другого способа решить эту проблему.

person Zoltán Ujhelyi    schedule 17.07.2012
comment
Я еще не вникал в код xtext, пока только в грамматику, но если то, что вы описываете, является единственным решением, то похоже, что у меня нет выбора. - person Oak; 17.07.2012

Я нашел решение. Как я и подозревал, параметр и инструкция должны иметь общего предка, но этот предок не обязательно должен когда-либо появляться в правой части любого грамматического правила. Итак, я определил:

ValueDef:
  Parameter | Instruction

а потом

Instruction:
  name=Value '=' 'eat' '(' ref=[ValueDef|Value] ')'

... а сами правила для Instruction и Parameter остались без изменений. Это означает, что инструкция не работает там, где ожидается параметр, но обе определяют ValueDef ссылок.

person Oak    schedule 17.07.2012