Мне нужно реализовать доменный язык. У меня есть панель и несколько фигур на ней.
'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), это ссылка на включение, хотя для ссылок, не включающих в себя, ссылочный объект хранится где-то еще, например, в другом объекте того же ресурса или даже в другом ресурсе. И дело в том, что перекрестная ссылка реализована как не вмещающая ссылка. Мне нужно знать, когда я должен использовать перекрестную ссылку, а когда использовать ссылку на сдерживание?