когда использовать перекрестную ссылку и когда использовать ссылку на защитную оболочку?

Мне нужно реализовать доменный язык. У меня есть панель и несколько фигур на ней.

 'panel' name = ID '('  title = STRING',' bgcolor = Color',' width = INT',' height = INT ')''{'((rects += Rect)| (ellipse += Ellipse)|(arcs += Arc)|)*'}'

и каждая форма имеет уникальное правило с некоторыми другими функциями. Например:

RoundRect:
'roundrectangle' name = ID '{'
(fill ?= 'filled' (fillpattern?='fillpattern' fillpaint=Paint)?)?
(stroke?='stroke' str=Stroke)?
'paint' paint=Paint
'coordination' x=INT ',' y=INT
'dimention' height=INT ',' width=INT
'arc' archeight=INT ',' arcwidth=INT
'}' 

как это очевидно в этом DSL, я использовал некоторые ссылки. Но я не знаю, что эти правила верны, или я должен использовать в них перекрестные ссылки? Это правило работает нормально, и я получаю ожидаемый результат. Но я знаю, что когда функция не имеет базового типа (строка, целое число и т. д.), она на самом деле является ссылкой (экземпляром EReference), это ссылка на включение, хотя для ссылок, не включающих в себя, ссылочный объект хранится где-то еще, например, в другом объекте того же ресурса или даже в другом ресурсе. И дело в том, что перекрестная ссылка реализована как не вмещающая ссылка. Мне нужно знать, когда я должен использовать перекрестную ссылку, а когда использовать ссылку на сдерживание?


person Azad    schedule 26.06.2014    source источник


Ответы (2)


Насколько я знаю, разница заключается в следующем:
Ссылка на включение — это если вы хотите сослаться на содержимое правила, поэтому просто лениво переопределять содержимое правила каждый раз, когда вы используете ссылку на включение.
Перекрестная ссылка ведет себя немного иначе: если вы используете перекрестную ссылку, синтаксическому анализатору необходимо, чтобы пользователь ввел содержимое правила, на которое ссылается перекрестная ссылка, прежде чем разрешить ему ссылаться на уже введенное содержимое.

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

Я надеюсь, что проиллюстрировал это достаточно хорошо, чтобы вы теперь знали о разнице и значении этих ссылочных типов.

Приветствие Крзмбрзл

person Raven    schedule 24.05.2015

Ваша грамматика описывает AST вашего языка. Следовательно, метамодель выводится из вашей грамматики. Для описания ссылок между вашими элементами AST вы можете использовать включаемые ссылки и перекрестные ссылки. Ссылка на включение используется, если вы хотите описать отношение родитель-потомок, где дочерний объект «создается»/декларируется во время создания родительского объекта. Перекрестная ссылка используется, если родительский объект указывает на дочерний объект, который создан/объявлен в другом родительском объекте. Чтобы «нарисовать картинку»: ссылка на включение — это ссылка сверху -> нижняя, а перекрестная ссылка — это ссылка слева -> справа.

Например, предположим, что у вас есть объявление поля (private int field = 42;) или метода (public void foo() {...}) класса Java. Это объявление моделируется ссылкой на включение, поскольку класс Java содержит объявления полей и методов. С другой стороны, у вас есть оператор field++; в теле метода foo(). Там вы используете прежнее объявленное поле foo, и оно моделируется как перекрестная ссылка.

В целом я бы сказал: любое объявление моделируется как ссылка на включение, а любое использование уже объявленного чего-либо моделируется как перекрестная ссылка.

person Joko    schedule 24.05.2015