Pergunta

Eu estou certo de que vou me disse para fazê-lo de outra forma, mas por razões específicas que tem de ser feito desta forma. Se isso não aconteceu, eu não seria :-P preso

A linguagem de script que estou trabalhando tem que aceitar as variáveis ??definidas como este:

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

Este é um requisito. Eu escrevi uma pequena gramática antes que me deixou defini-los como este

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

mas os requisitos alterados. O jeito que era antes a minha gramática olhou como este

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

Os valores da Stype eram ou System.String, Int32, etc., então o nome da variável e, em seguida, qualquer que seja a expressão era. Eu, então, projetou isso em um nó DeclareVar e deu-lhe os parâmetros necessários, no código eu analisados ??para XML e, em seguida, tiveram MGrammar analisar o XML e atravessou minha AST muito bem. Desde que eles querem ser capazes de fazer variáveis ??sem declarar o tipo, eu sou o tipo de preso sobre o que fazer agora, ou seja, como faço para obter meus variáveis ??que não têm um tipo declarado armazenados nas classes apropriadas. Qualquer ajuda seria apreciada, espero que tudo faz sentido.

Foi útil?

Solução 2

Graças Markus, que me pegou no caminho certo, aqui está o que eu acabei fazendo.

sintaxe sDeclareVar = tVariableKeywords s: Common.List (sVarDeclaration) ";" => Variablelist {Demonstrações {s}};

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

sintaxe sIntVarDeclaration = ""? i: Tid "(" x: tIntegerLiteral ")" => DeclareVar {VariableName {i}, Tipo {{Tipo RawValue { "System.Int32"}}}, valor {{InteiroLiteral RawValue {x}}}};

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

Tão perto daquilo que você tinha anteriormente, era mais fácil para armazenar as variáveis ??em uma lista embora, e eu também tive que adicionar algumas projeções para obter alguns dos nós de fora do gráfico eu não precisava. Obrigado pela ajuda.

Outras dicas

Depende de como o resto de sua gramática está estruturado, mas você pode ser preso fazendo algo mais ou menos ao longo das linhas 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}};

e assim por diante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top