我相信我会被告知用另一种方式来做这件事,但出于特定的原因,它必须这样做。如果没有,我就不会被卡住了:-P
我正在使用的脚本语言必须接受如下定义的变量:
Variables: x(1), y("hi"); 这是一个要求。在此之前,我写了一个小语法,让我这样定义它们
int x = 1;
string y = "hi"; 但需求发生了变化。在我的语法出现之前是这样的
syntax sDeclareVar = t:sType i:tID "=" x:sExpression ";" => DeclareVar { VariableName{i},Type{t},Value{x}};SType值可以是System.String、Int32等,然后是变量名,然后是表达式。然后,我将其映射到一个DeclareVar节点中,并为其提供所需的参数,在代码中,我将其解析为DeclareVar,然后让MGrammar解析该XML,并很好地遍历我的AST。因为他们希望能够在不声明类型的情况下执行变量,所以我有点纠结于现在该做什么,例如,我如何将没有声明类型的变量存储到适当的类中。任何帮助都将不胜感激,希望这一切都是有意义的。
发布于 2009-03-28 15:47:52
谢谢Markus,这让我走上了正确的道路,这就是我最终要做的。
语法sDeclareVar = tVariableKeywords s:Common.List(sVarDeclaration) ";“=> VariableList{语句{s}};
语法sVarDeclaration =s: syntax声明=> s|s:syntax声明=> s;
语法sIntVarDeclaration = ","?i:tID "(“x:t整型文字")”=> DeclareVar{VariableName{i},类型{RawValue{“System.Int32”},值{IntegerLiteral{RawValue{x};
语法sStringVarDeclaration = ","?i:tID '(‘x:tStringLiteral ')’=> DeclareVar{VariableName{i},类型{RawValue{“System.String”},值{StringLiteral{RawValue{x};
与上面的内容非常接近,所以将变量存储在列表中会更容易,而且我还必须添加一些投影,以便从图中提取一些不需要的节点。谢谢你的帮助。
发布于 2009-03-27 21:31:23
这取决于语法的其余部分是如何组织的,但你可能会被困在做一些大致如下的事情:
syntax sDeclareVar = "Variables:" sVarList ":";
syntax sVarList = sVarDeclaration ("," sVarList)?;
syntax sVarDeclaration = sIntVarDeclaration | sStringVarDeclaration | ...
syntax sIntVarDeclaration = i:tID "(" x:sIntegerLiteral ")" => DeclareVar VariableName{i},Type{Int32},Value{x}};
syntax sStringVarDeclaration = i:tID "(" x:sStringLiteral ")" => DeclareVar VariableName{i},Type{System.String},Value{x}};以此类推。
https://stackoverflow.com/questions/691461
复制相似问题