سؤال

وأنا متأكد من أني سوف تحصل على طلب منه أن يفعل ذلك بطريقة أخرى، ولكن لأسباب معينة لا بد من القيام به على هذا النحو. إذا لم يفعل ذلك، لن يكون عالقا I :-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}};

وكانت قيم قطيلة إما System.String، Int32، وما إلى ذلك، ثم اسم المتغير، ومن ثم مهما كان التعبير. وبعد ذلك يتوقع ذلك في عقدة DeclareVar وأعطاه المعلمات المطلوبة في التعليمات البرمجية I توزيعه إلى XML ثم قد MGrammar تحليل XML واجتاز بلدي AST على ما يرام. لأنها تريد أن تكون قادرة على القيام المتغيرات دون أن تعلن نوع، وأنا نوع من عالقين على ما يجب القيام به الآن، أي كيف يمكنني الحصول على المتغيرات لي أن لم يكن لديك نوع أعلن المخزنة في الطبقات المناسبة. سيكون موضع تقدير أي مساعدة، ونأمل كل ذلك من المنطقي.

هل كانت مفيدة؟

المحلول 2

وبفضل ماركوس، التي حصلت لي على الطريق الصحيح، وهنا ما انتهى به.

وتركيب sDeclareVar = tVariableKeywords الصورة: Common.List (sVarDeclaration) "؛" => VariableList {القوائم {ق}}؛

وتركيب sVarDeclaration = ق: sIntVarDeclaration => الصورة                          | الصورة: sStringVarDeclaration => الصورة؛

وتركيب sIntVarDeclaration = ""؟ ط: دار الاستثمار "(" س: tIntegerLiteral ")" => DeclareVar {VariableName {أنا}، {نوع نوع {{RawValue "System.Int32"}}}، {القيمة IntegerLiteral {RawValue {س}}}}؛

وتركيب sStringVarDeclaration = ""؟ ط: دار الاستثمار '(' س: tStringLiteral ')' => DeclareVar {VariableName {أنا}، {نوع نوع {{RawValue "System.String"}}}، {القيمة StringLiteral {RawValue {س}}}}؛

وقريبة جدا إلى ما كان أعلاه، كان من الأسهل لتخزين المتغيرات في قائمة رغم ذلك، وكان لي أيضا أن أضيف بعض التوقعات للحصول على بعض من العقد من الرسم البياني لم أكن في حاجة. شكرا للمساعدة.

نصائح أخرى

وذلك يعتمد على كيفية بناء ما تبقى من قواعد اللغة الخاصة بك، ولكن قد يكون عالقا تفعل شيئا تقريبا على غرار:

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