我目前正在研究语法,这应该允许我定义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 :(得分: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