我對Xtext很新,所以我不太瞭解所有相關的概念。有一個問題,特別是我找不到答案:
如何管理具有多個文件的語言的語法?
Xtext - 多文件語言
我正在使用的DSL通常使用四個文件,其中三個應在第一個文件中引用。所有文件共享相同的擴展名,但語法不盡相同。這可能嗎?
我對Xtext很新,所以我不太瞭解所有相關的概念。有一個問題,特別是我找不到答案:
如何管理具有多個文件的語言的語法?
Xtext - 多文件語言
我正在使用的DSL通常使用四個文件,其中三個應在第一個文件中引用。所有文件共享相同的擴展名,但語法不盡相同。這可能嗎?
如何管理多文件語言的文法?
Xtext首先解析文件,然後鏈接交叉引用。這些交叉引用可以是文件中的「內部」或「外部」。在這兩種情況下,linking和scoping系統都會爲您付出艱苦的努力。
所有文件共享相同的擴展名,但不是相同的語法。這可能嗎?
這似乎是一個不同的問題,但很可惜......
如果語法是真的不同,那麼你將有一個困難時期的Xtext。如果Xtext看到一個.foo
文件,它應該如何決定,應該應用哪個解析器?嘗試每一個,直到沒有發生錯誤?那麼如果該文件是用語法B編寫的但確實包含語法錯誤呢? ...
但經常有一個小竅門:真的是一個語法,但語法包含兩個幾乎分開的部分。使用哪個部分由文件中的前幾個關鍵字計算。
一個小例子:
文件A.foo:
module A {
// more stuff here
}
module B {
// also more stuff
}
文件B.foo:
system X {
use module A
use module B
}
語法可能是這樣的:
Model: Modules | Systems;
Modules: modules += Module;
Module: 'module' name=ID '{' '}';
Systems: systems += System;
System: 'system' name=ID '{' used+=UsedModule* '}';
UsedModule: 'use' 'module' module=[Module];
在這個語法中,一個文件可以在其上y包含module
XOR system
的定義,但不包含它們的組合。關鍵字module
或system
的首次出現決定了允許的內容。