У меня возникли проблемы с этой концепцией при создании DSL. Я не уверен, упускаю ли я простую вещь или что-то, что не предназначено для xtext. Надеюсь, кто-то может объяснить это мне в контексте этого примера.
Учитывая следующую минимальную грамматику:
Model:
'ns' name=QualifiedName
classes+=Class*
instances+=Instance*
uses+=Use*
;
Class:
'class' name=ID '{'
variables+=Variable*
'}'
;
Variable:
'var' variable=PrimaryVariable
;
Instance:
variable=PrimaryVariable '=' 'new' type=[Class]
;
Use:
reference=[PrimaryVariable|QualifiedName]
;
PrimaryVariable:
name=ID
;
QualifiedName:
ID ('.' ID)*
;
Я бы хотел написать следующий код, который, конечно, недействителен:
ns com.mine
class Class1 {
var var1
}
instance1 = new Class1
instance1.var1 // <- error here, can't resolve reference
С этой грамматикой и областью видимости по умолчанию будет работать только это:
ns com.mine
class Class1 {
var var1
}
instance1 = new Class1
Class1.var1
Итак, мой вопрос: как бы я реализовал концепцию обращения к переменным по квалифицированному имени через переменную экземпляра?
Не думаю, что мне удалось бы qualifiedNameProvider
добиться этого, потому что PrimaryVariable
не знает, в каком экземпляре он используется.
Конечно, я мог бы создать правило, которое использует две ссылки (и это то, что я сейчас делаю), одну на переменную экземпляра, а затем перебираю тип переменной экземпляра, чтобы получить переменные в области видимости для ссылки на переменную, но это похоже на хак к тому, как это должно быть и не так масштабируемо для вложенных объектов.
Это немного широкий вопрос, я надеюсь, что смогу получить информацию, прежде чем приступить к выполнению чего-то совершенно непродуктивного.