MGrammar语法和变量声明

时间:2009-03-27 21:12:28

标签: parsing grammar mgrammar

我确信我会被告知以另一种方式做到这一点,但由于特定原因,必须以这种方式完成。如果没有,我不会被卡住:-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就好了。因为他们希望能够在不声明类型的情况下进行变量,所以我现在仍然不知道该做什么,即如何将没有声明类型的变量存储到适当的类中。任何帮助将不胜感激,希望这一切都有意义。

2 个答案:

答案 0 :(得分: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}};

等等。

答案 1 :(得分:0)

感谢Markus,让我走上正轨,这就是我最终做的事情。

语法sDeclareVar = tVariableKeywords s:Common.List(sVarDeclaration)“;” =>的variablelist {语句{S}};

语法sVarDeclaration = s:sIntVarDeclaration =>小号                          | 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}}}};

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