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