Frage

Ich bin sicher, dass ich gesagt bekomme es eine andere Art und Weise zu tun, aber aus bestimmten Gründen hat es auf diese Weise zu tun. Falls es nicht klappt, würde ich nicht stecken :-P

Die Skriptsprache Ich arbeite an muss Variablen wie folgt definiert annehmen:

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

Dies ist eine Voraussetzung. Ich schrieb eine kleine Grammatik vor, dass ich sie wie folgt definieren lassen würde

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

aber die Anforderungen geändert. So wie es war, bevor meine Grammatik sah wie folgt aus

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 dann diese in einen DeclareVar Knoten und gab ihm die Parameter erforderlich, in dem Code, den ich es zu XML analysiert und dann hatte MGrammar die XML analysiert und durchlief mein AST gut. Da sie Variablen in der Lage sein zu tun, ohne die Art zu erklären, bin ich irgendwie auf stecken, was jetzt zu tun, das heißt, wie erhalte ich meine Variablen, die in die entsprechenden Klassen gespeichert keinen deklarierten Typ haben. Jede mögliche Hilfe würde geschätzt, hoffentlich alles macht Sinn.

War es hilfreich?

Lösung 2

Danke Markus, das mich auf dem richtigen Weg bekam, hier ist was ich am Ende tun.

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

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

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

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

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

Andere Tipps

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top