Espacios de nombres ANTLR v3 C #
-
11-07-2019 - |
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.
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