MGrammar грамматика и объявление переменных
Я уверен, что мне скажут сделать это по-другому, но по определенным причинам это должно быть сделано именно так. Если бы этого не произошло, я бы не застрял:-P
Язык сценариев, над которым я работаю, должен принимать переменные, определенные следующим образом:
Variables: x(1), y("hi");
Это требование. Я написал небольшую грамматику, прежде чем это позволило бы мне определить их так
int x = 1;
string y = "hi";
но требования изменились. Так было до того, как моя грамматика выглядела так
syntax sDeclareVar = t:sType i:tID "=" x:sExpression ";" => DeclareVar { VariableName{i},Type{t},Value{x}};
Значения sType были либо System.String, Int32 и т. д., затем имя переменной, а затем независимо от выражения. Затем я спроецировал это на узел DeclareVar и дал необходимые параметры, в коде я проанализировал его в XML, а затем MGrammar проанализировал XML и прошел мой AST очень хорошо. Поскольку они хотят иметь возможность делать переменные без объявления типа, я как бы застрял в том, что делать сейчас, то есть как я могу получить мои переменные, у которых нет объявленного типа, сохраненные в соответствующих классах. Любая помощь будет оценена, надеюсь, все это имеет смысл.
2 ответа
Спасибо, Маркус, благодаря которому я оказался на правильном пути, вот что я в итоге сделал.
синтаксис sDeclareVar = tVariableKeywords s:Common.List(sVarDeclaration) ";" => VariableList{Statements{s}};
синтаксис sVarDeclaration = s:sIntVarDeclaration => s | s:sStringVarDeclaration => s;
синтаксис sIntVarDeclaration = ","? i:tID "(" x:tIntegerLiteral ")" => DeclareVar{VariableName{i}, Type{Type{RawValue{"System.Int32"}}}, Value{IntegerLiteral{RawValue{x}}}};
синтаксис sStringVarDeclaration = ","? i:tID '(' x:tStringLiteral ')' => DeclareVar{VariableName{i}, Type{Type{RawValue{"System.String"}}}, Value{StringLiteral{RawValue{x}}}};
Так близко к тому, что вы имели выше, было проще хранить переменные в списке, и мне также пришлось добавить несколько проекций, чтобы вывести некоторые узлы из графика, который мне не нужен. Спасибо за помощь.
Это зависит от того, как структурирована остальная часть вашей грамматики, но вы можете застрять, делая что-то примерно так:
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}};
и так далее.