MGrammar грамматика и объявление переменных - PullRequest
1 голос
/ 28 марта 2009

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

0 голосов
/ 28 марта 2009

Спасибо, Маркус, благодаря которому я оказался на правильном пути, вот что я в итоге сделал.

синтаксис sDeclareVar = tVariableKeywords s: Common.List (sVarDeclaration) ";" => VariableList {Statements {s}};

синтаксис sVarDeclaration = s: sIntVarDeclaration => s | s: sStringVarDeclaration => s;

синтаксис sIntVarDeclaration = ","? i: tID "(" x: tIntegerLiteral ")" => DeclareVar {VariableName {i}, Тип {Тип {RawValue {"System.Int32"}}}, Значение {IntegerLiteral {RawValue {x}}}};

синтаксис sStringVarDeclaration = ","? i: tID '(' x: tStringLiteral ')' => DeclareVar {VariableName {i}, тип {Type {RawValue {"System.String"}}}, значение {StringLiteral {RawValue {x}}}};

Так близко к тому, что вы имели выше, было проще хранить переменные в списке, и мне также пришлось добавить некоторые проекции, чтобы вывести некоторые узлы из графика, который мне не нужен. Спасибо за помощь.

0 голосов
/ 28 марта 2009

Это зависит от того, как структурирована остальная часть вашей грамматики, но вы можете застрять, делая что-то примерно так:

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

и пр.

...