2013-05-30 94 views
6

我對Xtext很新,所以我不太瞭解所有相關的概念。有一個問題,特別是我找不到答案:
如何管理具有多個文件的語言的語法?
Xtext - 多文件語言

我正在使用的DSL通常使用四個文件,其中三個應在第一個文件中引用。所有文件共享相同的擴展名,但語法不盡相同。這可能嗎?

回答

6

如何管理多文件語言的文法?

Xtext首先解析文件,然後鏈接交叉引用。這些交叉引用可以是文件中的「內部」或「外部」。在這兩種情況下,linkingscoping系統都會爲您付出艱苦的努力。

所有文件共享相同的擴展名,但不是相同的語法。這可能嗎?

這似乎是一個不同的問題,但很可惜......

如果語法是真的不同,那麼你將有一個困難時期的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的定義,但不包含它們的組合。關鍵字modulesystem的首次出現決定了允許的內容。