Question

Je suis sûr que je vais me dit de le faire d'une autre manière, mais pour des raisons spécifiques, il doit être fait de cette façon. Si elle n'a pas, je ne serais pas coincé :-P

Le langage de script je travaille doit accepter les variables définies comme suit:

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

Ceci est une exigence. J'ai écrit une petite grammaire avant qui me permettrait de les définir comme ceci

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

mais les exigences ont changé. La façon dont il était avant ma grammaire ressemblait à ceci

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

Les valeurs de sType étaient soit System.String, Int32, etc., le nom de la variable, et quelle que soit l'expression était. Je puis projetais cela en un nœud DeclareVar et lui a donné les paramètres requis, dans le code I analysables à XML, puis avait MGrammar analyser le XML et traversai mon AST très bien. Comme ils veulent pouvoir faire des variables sans déclarer le type, je suis un peu coincé sur ce qu'il faut faire maintenant, à savoir comment puis-je obtenir mes variables qui ne disposent pas d'un type déclaré stocké dans les classes appropriées. Toute aide serait appréciée, je l'espère, il prend tout son sens.

Était-ce utile?

La solution 2

Merci Markus, qui m'a sur la bonne voie, voici ce que je fini par faire.

syntaxe sDeclareVar = tVariableKeywords s: Common.List (sVarDeclaration) ";" => VariableList {{s} Déclarations};

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

Syntaxe sIntVarDeclaration = ""? i: tid "(" x: tIntegerLiteral ")" => {DeclareVar VariableName {i}, type {{type rawvalue { "System.Int32"}}}, {valeur IntegerLiteral {{rawvalue x}}}};

Syntaxe sStringVarDeclaration = ""? i: Tid '(' x: tStringLiteral ')' => {DeclareVar VariableName {i}, type {{type rawvalue { "System.String"}}}, {valeur {rawvalue {chaine littérale x}}}};

Si proche de ce que vous aviez ci-dessus, il était plus facile de stocker les variables dans une liste bien, et je devais aussi ajouter quelques projections pour obtenir quelques-uns des noeuds sur le graphique que je ne l'ai pas besoin. Merci pour l'aide.

Autres conseils

Cela dépend de la façon dont le reste de votre grammaire est structuré, mais vous pourrait être coincé faire quelque chose à peu près le long des lignes de:

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

et ainsi de suite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top