JD – JSON Declaration Language

I’ve just added a new module called bm_jd to the pybm project. It implements a “little language” for declaring information, like a configuration file, when the details are all specified in JSON.

The language is very simple, consisting of semi-colon terminated statements; each statement having a command and zero or more arguments. Each argument may or may not have JSON data – if it does, it will be set off with a colon.

The BNF looks like this:

<document> ::= <statement>*

<statement> ::= <command> ( <word> | <word>:<json> )*

<command>|<word> ::= [a-zA-Z0-9_]

<json> ::= ... any valid JSON data ...

You can use the pybm JD parser in several ways:

  • implement a subclass of JDParser, defining CustomizeProduce; or
  • implement a subclass of DispatchJDParser, defining a call_<command> method for each command you plan to allow

In either case, you call a method FeedString to get the parser rolling.

There’s also a LogJDParser, which just dumps parsing results. Here’s an example of a JD document. Don’t worry about Djolt code in the JSON, that’s just text as far as this example is concerned:

read_template from:"fire_body" render:false;

map from:"fire.GetGeocodeIndidents" to:"incidents" map:{

"latitude" : "{{ latitude }}",

"longitude" : "{{ longitude }}",

"title" : "{{ AlarmLevel}}: {{ IncidentType }} on {{ RawStreet }}",

"uri" : "{{ HOME_URI }}#{{ IncidentNumber }}",

"body" : "{{ *fire_body|safe }}",

"IncidentNumber" : "{{ IncidentNumber }}"

};

read_template from:"gmaps" items:"incidents" meta:{

"id" : "maps",

"latitude" : 43.67,

"longitude" : -79.38,

"uzoom" : -13,

"gzoom" : 13,

"api_key" : "{{ cfg.gmaps.api_key|otherwise:'_' }}",

"html" : {

"width" : "1024px",

"height" : "800px"

}

};