MGrammar grammatica e di dichiarazione di variabili
Domanda
Sono sicuro che vado a prendere detto di fare in un altro modo, ma per motivi specifici che deve essere fatto in questo modo. Se così non fosse, non sarei stato bloccato :-P
Il linguaggio di scripting su cui sto lavorando deve accettare le variabili definite in questo modo:
Variables: x(1), y("hi");
Questo è un requisito. Ho scritto una piccola grammatica prima che mi permetteva loro definisco come questo
int x = 1;
string y = "hi";
ma i requisiti modificati. Il modo in cui era prima che la mia grammatica si presentava così
syntax sDeclareVar = t:sType i:tID "=" x:sExpression ";" => DeclareVar { VariableName{i},Type{t},Value{x}};
I valori di sType erano o System.String, Int32, ecc, quindi il nome della variabile, e quindi qualunque sia l'espressione era. Ho poi proiettato questo in un nodo di DeclareVar e ha dato i parametri richiesti, nel codice ho analizzato a XML e quindi aveva MGrammar analizzare il codice XML e attraversai la mia AST bene. Dal momento che essi vogliono essere in grado di fare le variabili senza dichiarare il tipo, Sono un po 'bloccato su cosa fare ora, vale a dire come faccio ad ottenere le mie variabili che non hanno un tipo dichiarato memorizzato nelle classi appropriate. Qualsiasi aiuto sarebbe apprezzato, speriamo che tutto ha un senso.
Soluzione 2
Grazie Markus, che mi ha sulla strada giusta, ecco cosa ho finito per fare.
sintassi sDeclareVar = tVariableKeywords s: Common.List (sVarDeclaration) ";" => {Variablelist Dichiarazioni {s}};
sintassi sVarDeclaration = s: sIntVarDeclaration => s | s: sStringVarDeclaration => s;
sintassi sIntVarDeclaration = ""? i: tID "(" x: tIntegerLiteral ")" => {DeclareVar VariableName {i}, {Tipo Tipo {{rawValue "System.Int32"}}}, {valore IntegerLiteral {rawValue {x}}}};
sintassi sStringVarDeclaration = ""? i: tID '(' x: tStringLiteral ')' => {DeclareVar VariableName {i}, {Tipo Tipo {{rawValue "System.String"}}}, {valore letterale stringa {rawValue {x}}}};
Così vicino a quello che si aveva in precedenza, era più facile per memorizzare le variabili in una lista, però, e ho anche dovuto aggiungere alcune proiezioni per ottenere alcuni dei nodi fuori del grafico non ho avuto bisogno. Grazie per l'aiuto.
Altri suggerimenti
Dipende da come il resto della tua grammatica è strutturato, ma si potrebbe essere bloccato facendo qualcosa o meno sulla falsariga di:
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}};
e così via.