Estoy tratando de analizar JavaScript (ECMASCript) con C#.problemas de gramática C#, ANTLR, ECMAScript
me encontré con la siguiente instrucción sobre cómo crear nuevo proyecto: http://www.antlr.org/wiki/pages/viewpage.action?pageId=557075
ANTLRWorks Así que he descargado, v3 antlr, desempaquetado antlr, creado un proyecto VS2010 (.NET4), añadido referencias, comprobado y generada la gramática.
Entonces me dieron un montón de error de compilación:
The type or namespace name 'AstParserRuleReturnScope' could not be found (are you missing a using directive or an assembly reference?)
The type or namespace name 'GrammarRule' could not be found (are you missing a using directive or an assembly reference?)
Stackoverlowed para ellos y tiene una solución: antlr c# errors when integrating into VS2008
Así que he descargado nuevo tiempo de ejecución, sobrescribir la antigua y vuelve a compilar el proyecto y consiguió
The name 'HIDDEN' does not exist in the current context d:\Workspace.1\ScriptParser\ScriptParser\TestLexer.cs
Ok, he cambiado HIDDEN en Oculto como se recomendó en la siguiente conversación: [antlr-interest] How viable is the Csharp3 target? (more specific questions)
Ahora estoy tratando de analizar la entrada. He encontrado algunos ejemplos y escribió el siguiente código:
using Antlr.Runtime;
namespace ScriptParser
{
class Program
{
static void Main(string[] args)
{
var stream = new ANTLRStringStream("1+2");
var lexer = new TestLexer(stream);
var tokenStream = new CommonTokenStream(lexer);
var parser = new TestParser(tokenStream);
// what exactly should be here???
}
}
}
Mi objetivo es analizador JavaScript archivo con antlr pero parece que va a ser el no tan fácil como pensaba ...
actualización :
Como se sugiere en Why are antlr3 c# parser methods private? he modificado la gramática Test.g añadiendo el "público" modificado antes de la regla expr:
public expr : mexpr (PLUS^ mexpr)* SEMI!
;
y luego regenera el código, sustituye ocultos para Hidden (de nuevo) y modificar el código como sigue:
var stream = new ANTLRStringStream("1+2");
var lexer = new TestLexer(stream);
var tokenStream = new CommonTokenStream(lexer);
var parser = new TestParser(tokenStream);
var result = parser.expr();
var tree = (CommonTree)result.Tree;
Y no que está fallando en la línea
root_0 = (object)adaptor.Nil();
en el siguiente código generado
try { DebugEnterRule(GrammarFileName, "expr");
DebugLocation(7, 0);
try
{
// d:\\Workspace.1\\ScriptParser\\ScriptParser\\Test.g:7:13: (mexpr (PLUS^mexpr)* SEMI !)
DebugEnterAlt(1);
// d:\\Workspace.1\\ScriptParser\\ScriptParser\\Test.g:7:15: mexpr (PLUS^mexpr)* SEMI !
{
root_0 = (object)adaptor.Nil();
DebugLocation(7, 15);
PushFollow(Follow._mexpr_in_expr31);
con el mensaje NullReferenceException porque el adaptador es nulo.
he resuelto añadiendo
parser.TreeAdaptor = new CommonTreeAdaptor();
Actualización 2:
Así que, finalmente he empezado con mi tarea principal: analizar JavaScript.
ANTLR highlights la gramática ECMAScript de Chris Lambrou.
Así que he generado analizador léxico/analizador y ejecutarlo con el simple código JavaScript:
var f = function() { };
y el análisis falla con el siguiente resultado de tree.ToStringTree():
<error: var q = function() { };>
Pagar este Q & A anterior: http://stackoverflow.com/questions/4396080/antlr-3-3-c-sharp-tutorials –
Gracias por su excelente tutorial. Según entiendo, las reglas de la gramática deberían convertirse en métodos. Uso la gramática de http://www.antlr.org/wiki/pages/viewpage.action?pageId=557075 y ANTLRWorks genera el "expr", "átomo" y otros métodos, pero son privados. –
Gracias Alex. W.r.t. los métodos privados (reglas del analizador), vea otro Q & A: http://stackoverflow.com/questions/6411520/why-are-antlr3-c-sharp-parser-methods-private –