2015-05-13 49 views
0

我目前正在研究一個語法,它應該允許我定義localand全局數組或變量。
本地人以下劃線開頭,這是名稱中唯一的區別。沒有特殊的關鍵字來定義它是本地的還是全局的,並且沒有關鍵字來指示該聲明是數組還是變量。
變量可以是一些正常類型和對另一個變量(本地或全局)的引用,並且數組可以使用標準大括號進行延遲或作爲對現有數組的引用。如何重寫這個語法,使其不再含糊不清

問題是,如果「name = reference」是變量或數組,則Xtext不能分開。
這是我現有的語法:

grammar org.declarations.dec.Dec with org.eclipse.xtext.common.Terminals 
import "http://www.eclipse.org/emf/2002/Ecore" as ecore 

generate dec "http://www.declarations.org/dec/Dec" 

Model: 
delarations+=(Declaration)* 
; 

Declaration: 
Variable ";" | Array ";" 
; 

Variable: 
    LocalVar 
    | GlobalVar 
; 

    LocalVar: 
     name=LOCALNAME "=" variableContent=VarContent 
    ; 

    GlobalVar: 
     name=GLOBALNAME "=" variableContent=VarContent 
    ; 

     VarContent: 
      stringContent=STRING 
      | IntContent=INT 
      | localRef=[LocalVar|LOCALNAME] 
      | globalRef=[GlobalVar|GLOBALNAME] 
     ; 

Array: 
    LocalArray 
    |GlobalArray 
; 

    LocalArray: 
     name=LOCALNAME "=" content=ArrayLiteral 
    ; 

    GlobalArray: 
     name=GLOBALNAME "=" content=ArrayLiteral 
    ; 

     ArrayLiteral: 
      "[" (c1=ArrayContent ("," c2+=ArrayContent)*)? "]" 
      | localRef=[LocalArray|LOCALNAME] 
      | globalRef=[GlobalArray|GLOBALNAME] 
     ; 

      ArrayContent: 
       varContent=VarContent 
       | localRef=[LocalArray|LOCALNAME] 
       | globalRef=[GlobalArray|GLOBALNAME] 
      ; 



terminal LOCALNAME: 
    "_" ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')* 
; 
terminal GLOBALNAME: 
    ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')* 
; 

我想認識的代碼,例如:

_localVar1 = "Test"; 
globalVar1 = _localVar1; 

globalArray = ["hello",globalVar1]; 
nextArray = globalArray; 
anotherArray = [globalArray, nextArray]; 

有誰有一個想法如何解決這個問題?

問候Krzmbrzl

+0

這是不可能而不失去語義或寧願一個構建體'''XXXX = yyyy'''or'''_xxx = _yyy'''均爲變量和數組。爲什麼你根本不同?爲什麼不引入VarContent是數組,並將Array轉儲爲dev –

+0

以及我想要區分它們,因爲我想將它們用於接受變量或數組的命令的語法......具體來說,「dump數組開發空「? – Raven

+0

嗨,你應該分開類型系統和ast。因此有一個只有變量的ast和一個類型系統,它檢查在正確的位置只使用正確的類型(與java所使用的方式相同)。因此,你應該扔掉陣列,只有變數 –

回答

1

由於我的問題是通過評論僅供網友回答我會寫一個答案,因此問題不會在未應答部分。感謝Christian Dietrich,我找到了解決方案:

解決方案是讓解析器忽略該聲明是變量還是數組,並忽略該聲明是本地還是全局。將得到的語法看起來如下:

Model: 
elements += Code* 
; 

Code: 
dec=Declaration ";" 
; 

Declaration: 
    name = ID "=" decCon=DecContent 
; 

    DecContent: 
     singleContent=VarContent (op+=OPERATOR nextCon+=VarContent)* 
    ; 

     VarContent: 
      num = NUMBER 
      | string = STRING 
      | reference = [Declaration] 
      | "+"? arrayContent=ArrayLiteral 
     ; 

      ArrayLiteral: 
       con = "[" (content = VarContent ("," nextContent += VarContent)*)? "]" 
      ; 

搞清楚的聲明是否是一個變量,數組,本地或gloabal是驗證的任務。
此處的規則是:儘可能少地使用解析器,儘可能使用驗證器。

希望這可以幫助你,當你有類似的問題。

問候Krzmbrzl