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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top