Pregunta

Espero que esta sea realmente rápida;) He escrito una especificación lexer / parser en ANTLR3, y estoy apuntando al objetivo CSharp2. El código generado funciona correctamente, pero no puedo hacer que ANTLR ponga la salida de C # en un espacio de nombres.

La sección relevante del archivo Grammar es la siguiente:

grammar MyGrammar;

options
{
    language = CSharp2;
    output = AST;
    ASTLabelType = CommonTree;
}

Para generar el espacio de nombres correcto, he intentado:

@namespace { MyNamespace }

y

@lexer::namespace { MyNamespace }
@parser::namespace { MyNamespace }

pero ambos generan errores, alegando que el archivo no tiene reglas.

Cualquier ayuda es apreciada.

¿Fue útil?

Solución

Utilizo esto para un lexer y un analizador combinados (y genera el espacio de nombres correctamente):

grammar Test;

options
{
    language=CSharp2;
}

@lexer::namespace {
    My.Name.Space
}

@parser::namespace {
    My.Name.Space
}


DIGIT   :   '0'..'9';

simple  :    DIGIT EOF;

Entonces, me pregunto por qué su versión no funcionó; tal vez quiera probar este sencillo ejemplo y ver si funciona para usted.

Otros consejos

Parece que la directiva @namespace necesita colocarse DESPUÉS del bloque de tokens {}. Todo bien ahora ...

Con language = 'CSharp3'; (y CSharp2 también), puede hacer:

@lexer::namespace {
    My.Name.Space
}

@parser::namespace {
    My.Name.Space
}

que genera:

} // namespace 
 My.Name.Space <-- compile error here

al final del código lexer y parser. Si escribo:

@lexer::namespace {My.Name.Space}

@parser::namespace {My.Name.Space}

funciona bien y genera:

} // namespace My.Name.Space <-- within the line comment, no error of course
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top