domingo, 7 de septiembre de 2014

Ejemplo Gramática JSON en Irony .NET

 Otro ejemplo que puede servir para entender el funcionamiento de Irony es esta gramática para lenguaje JSON:
Un ejemplo del lenguaje para poder entender mejor la gramática:

EJEMPLO JSON:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}



GRAMATICA:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Irony.Parsing;

namespace Irony.Samples.Json {
  [Language("JSON", "1.0", "JSON data format")]
  public class JsonGrammar : Grammar {


//COMO SE HA VISTO EN EL CONSTRUCTOR ES DONDE SE DECLARA LA GRAMÁTICA
    public JsonGrammar() {


      //TERMINALES
      var jstring = new StringLiteral("string", "\""); //cadena de strings encerrados por "
      var jnumber = new NumberLiteral("number"); //numeros
      var comma = ToTerm(",");  //coma
     
      //NO TERMINALES

      var jobject = new NonTerminal("Object");
      var jobjectBr = new NonTerminal("ObjectBr");
      var jarray = new NonTerminal("Array");
      var jarrayBr = new NonTerminal("ArrayBr");
      var jvalue = new NonTerminal("Value");
      var jprop = new NonTerminal("Property");

      //REGLAS
      jvalue.Rule = jstring | jnumber | jobjectBr | jarrayBr | "true" | "false" | "null";
      jobjectBr.Rule = "{" + jobject + "}";
      jobject.Rule = MakeStarRule(jobject, comma, jprop);
      jprop.Rule = jstring + ":" + jvalue;
      jarrayBr.Rule = "[" + jarray + "]";
      jarray.Rule = MakeStarRule(jarray, comma, jvalue);

      //SE COLOCA LA RAÍZ
      this.Root = jvalue;
      MarkPunctuation("{", "}", "[", "]", ":", ",");


      //ESTA DIRECTIVA SE COLOCA PARA QUE ESTOS NO TERMINALES NO APAREZCAN EN EL ARBOL YA QUE SON PARTE DE LA GRAMÁTICA PERO NO SE UTILIZARÁN EN EL ANÁLISIS POSTERIOR DEL ÁRBOL (PARA ESTE EJEMPLO NO SE CREÓ AST)
      this.MarkTransient(jvalue, jarrayBr, jobjectBr);

    }//constructor
  }//class
}//namespace

No hay comentarios:

Publicar un comentario