2012-02-08 12 views
9

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() { };> 
+0

Pagar este Q & A anterior: http://stackoverflow.com/questions/4396080/antlr-3-3-c-sharp-tutorials –

+0

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. –

+0

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 –

Respuesta

1

Su regla gramatical dice que no debe haber un punto y coma al final de la expresión, pero en la que la función principal:

var stream = new ANTLRStringStream("1+2"); 

falta un punto y coma. ¿No debería ser "1 + 2"?

+0

Sin duda, "1 + 2;" es válido Javascript. Pero también lo es "1 + 2" (o al menos "1 + 2 \ n"). ¿Cómo maneja la gramática ANTLR el ";" que faltaba; ¿pregunta? –

Cuestiones relacionadas