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
這是不可能而不失去語義或寧願一個構建體'''XXXX = yyyy'''or'''_xxx = _yyy'''均爲變量和數組。爲什麼你根本不同?爲什麼不引入VarContent是數組,並將Array轉儲爲dev –
以及我想要區分它們,因爲我想將它們用於接受變量或數組的命令的語法......具體來說,「dump數組開發空「? – Raven
嗨,你應該分開類型系統和ast。因此有一個只有變量的ast和一個類型系統,它檢查在正確的位置只使用正確的類型(與java所使用的方式相同)。因此,你應該扔掉陣列,只有變數 –