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

Markus に感謝します。これで正しい軌道に乗ることができました。

構文 sDeclareVar = tVariableKeywords s:Common.List(sVarDeclaration) ";" => VariableList{Statements{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 に答える