2013-08-22 61 views
5

以下是我的語法規則:如何獲取EObject在原始文檔中的位置(#行)?

Stmts: (stmts += Stmt ';')* ; 
Stmt: Stmt1 | Stmt2 | Stmt3 ... ; 

我想知道每個語句##是在第撐條語句和他們的確切位置(原文件#n行)。這樣我可以指出用戶犯錯時的位置。

我重寫驗證器的構造函數,並存儲一個HashMap <Stmt, Integer>以獲得每個Stmt#是stmts中的#thstt(不知道這是否是正確的方式來執行...)。但是我不知道如何獲得他們的行號。

任何幫助?

回答

4

給定一個EObject,您可以使用org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode(EObject)輕鬆獲取源文件中的位置。

例如:

INode node = NodeModelUtils.getNode(o); 
    System.out.println(String.format("Node goes from line %s to line %s",node.getStartLine(), node.getEndLine())); 
+0

如果我把任何@Check標註的方法我會得到'第一行 - 這種表述在此背景下不允許的,因爲它不 造成任何副作用。,我在哪裏做錯了? –

+0

我不知道你在這裏輸入了哪個@Check註釋,但我想我可以解釋錯誤信息。如果你只把第一行寫入,你只能讀取一個值,但不能改變任何東西。所以,如果你對你讀的價值沒有做任何事情,那麼閱讀是毫無意義的。放入兩行,錯誤應該消失。 –

+0

我知道發生了什麼......我使用的是xtext 2.4,xtext驗證器的默認語言是xtend而不是java。 xtend中的第一行應該是'val INode node = NodeModelUtils.getNode(o);'謝謝Stefan,這正是我想要的。 –

0

爲了指出錯誤,簡單地編寫一個聲明式驗證器更適合 - 在這種情況下,您只需給Xtext帶來問題的EObject,並設法將其追溯回源。此外,在您的語言項目中會生成驗證程序存根。

但是,如果您需要手動追溯節點,則可以使用Injectable ILocationInFileProvider來幫助您。

相關問題