Pregunta

Estoy seguro de que obtendrá dicho hacer de otra manera, pero por razones específicas que tiene que ser hecho de esta manera. Si no fuera así, no estaría atrapado :-P

El lenguaje de script que estoy trabajando tiene que aceptar las variables definidas como sigue:

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

Este es un requisito. Escribí una pequeña gramática antes de que me permitiera defino como esto

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

pero los requisitos cambian. La forma en que estaba antes de mi gramática parecía esto

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

Los valores de sType eran o System.String, Int32, etc., entonces el nombre de la variable, y entonces todo lo que la expresión era. luego proyecté esto en un nodo DeclareVar y se lo di los parámetros requeridos, en el código que he analizado sintácticamente a XML y luego había MGrammar analizar el XML y atravesó mi AST bien. Ya que quieren ser capaces de hacer las variables sin declarar el tipo, estoy un poco atascado en qué hacer ahora, es decir, cómo consigo mis variables que no tienen un tipo declarado almacenada en las clases apropiadas. Cualquier ayuda se agradece, esperemos que todo tiene sentido.

¿Fue útil?

Solución 2

Gracias Markus, que me metió en el camino correcto, esto es lo que terminé haciendo.

sintaxis sDeclareVar = tVariableKeywords s: Common.List (sVarDeclaration) ";" => Variablelist {Declaraciones {s}};

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

sIntVarDeclaration sintaxis = ""? i: tID "(" x: tIntegerLiteral ")" => DeclareVar {VariableName {i}, Tipo {Tipo {RawValue { "System.Int32"}}}, Valor {IntegerLiteral {RawValue {x}}}};

sStringVarDeclaration sintaxis = ""? i: tID '(' x: tStringLiteral ')' => DeclareVar {VariableName {i}, Tipo {Tipo {RawValue { "System.String"}}}, Valor {StringLiteral {RawValue {x}}}};

Tan cerca de lo que tenía antes, que era más fácil de almacenar las variables en una lista sin embargo, y también he tenido que añadir algunas proyecciones para obtener algunos de los nodos de la gráfica que no necesitaba. Gracias por la ayuda.

Otros consejos

Depende de cómo se estructura el resto de su gramática, pero usted puede ser atrapado haciendo algo más o menos a lo largo de las líneas 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}};

y así sucesivamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top