| pt::peg::from::json(n) | Parser Tools | pt::peg::from::json(n) |
pt::peg::from::json - PEG Conversion. Read JSON format
package require Tcl 8.5
package require pt::peg::from::json ?1?
package require pt::peg
package require json
pt::peg::from::json convert text
Are you lost ? Do you have trouble understanding this document ? In that case please read the overview provided by the Introduction to Parser Tools. This document is the entrypoint to the whole system the current package is a part of.
This package implements the converter from JSON markup to parsing expression grammars.
It resides in the Import section of the Core Layer of Parser Tools, and can be used either directly with the other packages of this layer, or indirectly through the import manager provided by pt::peg::import. The latter is intented for use in untrusted environments and done through the corresponding import plugin pt::peg::import::json sitting between converter and import manager.
IMAGE: arch_core_iplugins
The API provided by this package satisfies the specification of the Converter API found in the Parser Tools Import API specification.
The json format for parsing expression grammars was written as a data exchange format not bound to Tcl. It was defined to allow the exchange of grammars with PackRat/PEG based parser generators for other languages.
It is formally specified by the rules below:
As an aside to the advanced reader, this is pretty much the same as the Tcl serialization of PE grammars, as specified in section PEG serialization format, except that the Tcl dictionaries and lists of that format are mapped to JSON objects and arrays. Only the parsing expressions themselves are not translated further, but kept as JSON strings containing a nested Tcl list, and there is no concept of canonicity for the JSON either.
Assuming the following PEG for simple mathematical expressions
PEG calculator (Expression)
Digit <- '0'/'1'/'2'/'3'/'4'/'5'/'6'/'7'/'8'/'9' ;
Sign <- '-' / '+' ;
Number <- Sign? Digit+ ;
Expression <- '(' Expression ')' / (Factor (MulOp Factor)*) ;
MulOp <- '*' / '/' ;
Factor <- Term (AddOp Term)* ;
AddOp <- '+'/'-' ;
Term <- Number ;
END;
a JSON serialization for it is
{
"pt::grammar::peg" : {
"rules" : {
"AddOp" : {
"is" : "\/ {t -} {t +}",
"mode" : "value"
},
"Digit" : {
"is" : "\/ {t 0} {t 1} {t 2} {t 3} {t 4} {t 5} {t 6} {t 7} {t 8} {t 9}",
"mode" : "value"
},
"Expression" : {
"is" : "\/ {x {t (} {n Expression} {t )}} {x {n Factor} {* {x {n MulOp} {n Factor}}}}",
"mode" : "value"
},
"Factor" : {
"is" : "x {n Term} {* {x {n AddOp} {n Term}}}",
"mode" : "value"
},
"MulOp" : {
"is" : "\/ {t *} {t \/}",
"mode" : "value"
},
"Number" : {
"is" : "x {? {n Sign}} {+ {n Digit}}",
"mode" : "value"
},
"Sign" : {
"is" : "\/ {t -} {t +}",
"mode" : "value"
},
"Term" : {
"is" : "n Number",
"mode" : "value"
}
},
"start" : "n Expression"
}
}
and a Tcl serialization of the same is
pt::grammar::peg {
rules {
AddOp {is {/ {t -} {t +}} mode value}
Digit {is {/ {t 0} {t 1} {t 2} {t 3} {t 4} {t 5} {t 6} {t 7} {t 8} {t 9}} mode value}
Expression {is {/ {x {t (} {n Expression} {t )}} {x {n Factor} {* {x {n MulOp} {n Factor}}}}} mode value}
Factor {is {x {n Term} {* {x {n AddOp} {n Term}}}} mode value}
MulOp {is {/ {t *} {t /}} mode value}
Number {is {x {? {n Sign}} {+ {n Digit}}} mode value}
Sign {is {/ {t -} {t +}} mode value}
Term {is {n Number} mode value}
}
start {n Expression}
}
The similarity of the latter to the JSON should be quite obvious.
Here we specify the format used by the Parser Tools to serialize Parsing Expression Grammars as immutable values for transport, comparison, etc.
We distinguish between regular and canonical serializations. While a PEG may have more than one regular serialization only exactly one of them will be canonical.
Assuming the following PEG for simple mathematical expressions
PEG calculator (Expression)
Digit <- '0'/'1'/'2'/'3'/'4'/'5'/'6'/'7'/'8'/'9' ;
Sign <- '-' / '+' ;
Number <- Sign? Digit+ ;
Expression <- '(' Expression ')' / (Factor (MulOp Factor)*) ;
MulOp <- '*' / '/' ;
Factor <- Term (AddOp Term)* ;
AddOp <- '+'/'-' ;
Term <- Number ;
END;
then its canonical serialization (except for whitespace) is
pt::grammar::peg {
rules {
AddOp {is {/ {t -} {t +}} mode value}
Digit {is {/ {t 0} {t 1} {t 2} {t 3} {t 4} {t 5} {t 6} {t 7} {t 8} {t 9}} mode value}
Expression {is {/ {x {t (} {n Expression} {t )}} {x {n Factor} {* {x {n MulOp} {n Factor}}}}} mode value}
Factor {is {x {n Term} {* {x {n AddOp} {n Term}}}} mode value}
MulOp {is {/ {t *} {t /}} mode value}
Number {is {x {? {n Sign}} {+ {n Digit}}} mode value}
Sign {is {/ {t -} {t +}} mode value}
Term {is {n Number} mode value}
}
start {n Expression}
}
Here we specify the format used by the Parser Tools to serialize Parsing Expressions as immutable values for transport, comparison, etc.
We distinguish between regular and canonical serializations. While a parsing expression may have more than one regular serialization only exactly one of them will be canonical.
Assuming the parsing expression shown on the right-hand side of the rule
Expression <- '(' Expression ')'
/ Factor (MulOp Factor)*
then its canonical serialization (except for whitespace) is
{/ {x {t (} {n Expression} {t )}} {x {n Factor} {* {x {n MulOp} {n Factor}}}}}
This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category pt of the Tcllib SF Trackers [http://sourceforge.net/tracker/?group_id=12883]. Please also report any ideas for enhancements you may have for either package and/or documentation.
EBNF, JSON, LL(k), PEG, TDPL, context-free languages, conversion, expression, format conversion, grammar, matching, parser, parsing expression, parsing expression grammar, push down automaton, recursive descent, serialization, state, top-down parsing languages, transducer
Parsing and Grammars
Copyright (c) 2009 Andreas Kupries <andreas_kupries@users.sourceforge.net>
| 1 | pt |