1

我敢肯定,我会被告知以另一种方式进行,但出于特定原因,必须以这种方式进行。如果没有,我就不会被卡住:-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 节点并为其提供所需的参数,在代码中我将其解析为 XML,然后让 MGrammar 解析 XML 并很好地遍历我的 AST。由于他们希望能够在不声明类型的情况下执行变量,所以我有点坚持现在要做什么,即如何将没有声明类型的变量存储到适当的类中。任何帮助将不胜感激,希望这一切都有意义。

4

2 回答 2

0

这取决于语法的其余部分的结构,但您可能会被卡在大致按照以下方式进行操作:

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}};

等等。

于 2009-03-27T21:31:22.733 回答
0

谢谢马库斯,这让我走上了正轨,这就是我最终要做的。

语法 sDeclareVar = tVariableKeywords s:Common.List(sVarDeclaration) ";" => 变量列表{语句{s}};

语法 sVarDeclaration = s:sIntVarDeclaration => s | s:sStringVarDeclaration => s;

语法 sIntVarDeclaration = ","? i:tID "(" x:tIntegerLiteral ")" => DeclareVar{VariableName{i}, Type{Type{RawValue{"System.Int32"}}}, Value{IntegerLiteral{RawValue{x}}}};

语法 sStringVarDeclaration = ","? i:tID '(' x:tStringLiteral ')' => DeclareVar{VariableName{i}, Type{Type{RawValue{"System.String"}}}, Value{StringLiteral{RawValue{x}}}};

如此接近您上面的内容,尽管将变量存储在列表中更容易,而且我还必须添加一些预测以将一些节点从我不需要的图中取出。谢谢您的帮助。

于 2009-03-28T15:47:52.020 回答