Вопрос

Я уверен, что мне скажут сделать это по-другому, но по определенным причинам это нужно сделать именно так.Если бы это было не так, я бы не застрял :-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) ";" => VariableLelist {операторы {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}};

и так далее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top