سؤال
ونأمل أن هذا هو حقا سريعة واحد؛) كنت قد كتبت مواصفات lexer / محلل في ANTLR3، وأنا استهداف الهدف CSharp2. الشفرة التي تم إنشاؤها يعمل بشكل صحيح، ولكن لا أستطيع الحصول على ANTLR لوضع C # الإخراج إلى مساحة الاسم.
القسم ذي الصلة من ملف القواعد كما يلي:
grammar MyGrammar;
options
{
language = CSharp2;
output = AST;
ASTLabelType = CommonTree;
}
لتوليد مساحة الاسم الصحيح، لقد حاولت:
@namespace { MyNamespace }
و
@lexer::namespace { MyNamespace }
@parser::namespace { MyNamespace }
ولكن كلا من هذه توليد الأخطاء، مدعيا أن الملف لا يوجد لديه قواعد.
وهو محل تقدير أي مساعدة.
المحلول
وأنا استخدم هذا لlexer جنبا إلى جنب ومحلل (وهذا يولد مساحة الاسم بشكل صحيح):
grammar Test;
options
{
language=CSharp2;
}
@lexer::namespace {
My.Name.Space
}
@parser::namespace {
My.Name.Space
}
DIGIT : '0'..'9';
simple : DIGIT EOF;
لذلك أنا أتساءل لماذا نسختك لم تنجح - ربما كنت تريد أن تجرب هذا مثال بسيط ومعرفة ما اذا كان يعمل للكم
نصائح أخرى
ويبدو أن التوجيهnamespace يتعين أن يوضع AFTER الرموز {كتلة}. كل شيء جيد الآن ...
ومع language = 'CSharp3';
(وCSharp2 كذلك)، يمكنك القيام به:
@lexer::namespace {
My.Name.Space
}
@parser::namespace {
My.Name.Space
}
والذي يولد:
} // namespace
My.Name.Space <-- compile error here
وفي نهاية lexer ورمز محلل. إذا أنا أكتب:
@lexer::namespace {My.Name.Space}
@parser::namespace {My.Name.Space}
وأنه يعمل بشكل جيد ويولد:
} // namespace My.Name.Space <-- within the line comment, no error of course