Logré resolver esto adaptando el ejemplo al final de Manuel Abadia's article.
Aquí está mi versión, que estoy usando para convertir el código analizado a C#. Estos son los pasos:
- una instancia de un ANTLRStringStream o subclase con su entrada (que puede ser un archivo o una cadena).
- Crea una instancia de tu lexer generado, pasando esa secuencia de cadenas.
- Cree una secuencia de token con el lexer.
- Crea una instancia de tu analizador con esa secuencia de token.
- Obtenga el valor de nivel superior de su analizador y conviértalo en
CommonTree
.
- recorrer el árbol:
Para obtener el texto literal de un nodo, utilice node.Text
. Para obtener el nombre del token de un nodo, use node.Token.Text
.
Tenga en cuenta que node.Token.Text
solo le dará el nombre real de su token si se trata de un token imaginario sin la cadena correspondiente. Si es un token real, entonces node.Token.Text
devolverá su cadena.
Por ejemplo, si usted tenía lo siguiente en su gramática:
tokens { PROGRAM, FUNCDEC }
EQUALS : '==';
ASSIGN : '=';
entonces obtendrá "PROGRAM"
, "FUNCDEC"
, "=="
y "="
partir de los correspondientes accesos de node.Token.Text
.
Puede ver parte de mi ejemplo a continuación, o puede navegar por el full version.
public static string Convert(string input)
{
ANTLRStringStream sStream = new ANTLRStringStream(input);
MyGrammarLexer lexer = new MyGrammarLexer(sStream);
CommonTokenStream tStream = new CommonTokenStream(lexer);
MyGrammarParser parser = new MyGrammarParser (tStream);
MyGrammarParser.program_return parserResult = parser.program();
CommonTree ast = (CommonTree)parserResult.Tree;
Print(ast);
string output = header + body + footer;
return output;
}
public static void PrintChildren(CT ast)
{
PrintChildren(ast, " ", true);
}
public static void PrintChildren(CT ast, string delim, bool final)
{
if (ast.Children == null)
{
return;
}
int num = ast.Children.Count;
for (int i = 0; i < num; ++i)
{
CT d = (CT)(ast.Children[i]);
Print(d);
if (final || i < num - 1)
{
body += delim;
}
}
}
public static void Print(CommonTree ast)
{
switch (ast.Token.Text)
{
case "PROGRAM":
//body += header;
PrintChildren(ast);
//body += footer;
break;
case "GLOBALS":
body += "\r\n\r\n// GLOBALS\r\n";
PrintChildren(ast);
break;
case "GLOBAL":
body += "public static ";
PrintChildren(ast);
body += ";\r\n";
break;
....
}
}
cualquier código de ejemplo del árbol de gramática para C#? – Kiquenet