質問

私は、私はそれを別の方法を行うように言われますと確信していますが、具体的な理由から、この方法を行う必要があります。それがなかった場合は、私が立ち往生されない:-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

右のトラックに私を得たおかげでマルクスは、ここで私がやってしまったものです。

構文sDeclareVar = tVariableKeywords S:Common.List(sVarDeclaration) ";" => VariableList {文{S}};

構文sVarDeclaration = S:sIntVarDeclaration => S                          | S:sStringVarDeclaration => S

構文sIntVarDeclaration = ""? I:にtID "(" X:tIntegerLiteral ")" => DeclareVar {変数名{I}、タイプ{タイプ{RawValue { "可能System.Int32"}}}、値{IntegerLiteral {RawValue {X}}}};

構文sStringVarDeclaration = ""? I:にtID '(' X:tStringLiteral ')' => DeclareVar {変数名{I}、タイプ{タイプ{RawValue { "可能System.String"}}}、値{StringLiteral {RawValue {X}}}};

あなたは上記の持っていたものを

近いので、しかし、リスト内の変数を格納するために簡単だった、と私はまた、私は必要はありませんでしたグラフのうち、ノードの一部を取得するには、いくつかの予測を追加する必要がありました。助けてくれてありがとう。

他のヒント

これはあなたの文法の残りの部分が構成されているかに依存しますが、おおよその線に沿って何かをやって立ち往生することがあります。

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

など。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top