2009-03-27 8 views
1

Ich bin mir sicher, dass ich dazu aufgefordert werde, es anders zu machen, aber aus bestimmten Gründen muss es so gemacht werden. Falls es nicht klappt, würde ich nicht stecken :-PMGrammar Grammatik und Variablendeklaration

Die Skriptsprache Ich arbeite an hat Variablen akzeptieren wie folgt definiert:

Variables: x(1), y("hi"); 

Dies ist eine Anforderung. Ich schrieb eine kleine Grammatik, bevor ich sie so definieren würde

int x = 1; 
string y = "hi"; 

aber die Anforderungen geändert. So wie es war, bevor meine Grammatik wie diese

sah
syntax sDeclareVar = t:sType i:tID "=" x:sExpression ";" => DeclareVar { VariableName{i},Type{t},Value{x}}; 

sType Werte waren entweder System.String, Int32, usw., dann ist die Variablennamen, und dann, was auch immer der Ausdruck war. Ich projizierte das dann in einen DeclareVar-Knoten und gab ihm die erforderlichen Parameter, im Code analysierte ich es nach XML und dann ließ MGrammar den XML-Code parsen und passierte meinen AST ganz gut. Da sie in der Lage sein wollen, Variablen auszuführen, ohne den Typ zu deklarieren, bleibe ich bei dem, was jetzt zu tun ist, nämlich, wie bekomme ich meine Variablen, die keinen deklarierten Typ haben, in den entsprechenden Klassen gespeichert. Jede Hilfe wäre willkommen, hoffentlich macht alles einen Sinn.

Antwort

0

Danke Markus, das hat mich auf den richtigen Weg gebracht, hier ist, was ich getan habe.

Syntax sDeclareVar = tVariableKeywords s: Common.List (sVarDeclaration) ";" => Variablenliste {Anweisungen {s}};

Syntax sVarDeclaration = s: sIntVarDeclaration => s | s: sStringVarDeclaration => s;

Syntax sIntVarDeclaration = ","? i: tID "(" x: tIntegerLiteral ")" => DeclareVar {Variablenname {i}, Typ {Type {RawValue {"System.Int32"}}}, Wert {IntegerLiteral {RawValue {x}}}};

Syntax sStringVarDeclaration = ","? i: tID '(' x: tStringLiteral ')' => Deklarationsvariable {Variablenname {i}, Typ {Typ {RawValue {"System.String"}}}, Wert {StringLiteral {RawValue {x}}}};

So nah an dem, was Sie oben hatten, war es einfacher, die Variablen in einer Liste zu speichern, und ich musste auch einige Projektionen hinzufügen, um einige der Knoten aus dem Diagramm zu bekommen, die ich nicht brauchte. Danke für die Hilfe.

0

Es hängt davon ab, wie der Rest der Grammatik strukturiert ist, aber Sie könnten etwas zu tun, etwa entlang der Linien geklebt werden:

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

und so weiter.