سؤال

ونأمل أن هذا هو حقا سريعة واحد؛) كنت قد كتبت مواصفات 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top