JSON-LD grammar

As announced in the last mail, I've just fixed the last remaining issues in
the JSON-LD Grammar section. It definitely does the job, I was just
wondering whether we should also include a more formal, ABNF-like grammar
(or maybe even replace the prose). Unfortunately it seems that currently
there's no accepted way or best-practice to specify JSON "grammars" (the
JSON Schema Internet Draft expired two years ago [1]).

So I tried to come up with something ABNF-like (it's not valid ABNF) and
would be interested in hearing your opinions. I'm not sure myself yet
whether that helps or confuses people.

graph = node-obj / node-obj[]

node-obj =
    {
        "@context": context-def       (0..1)
        "@id": string                 (0..1)
        "@type": iri / iri[]          (0..1)
        "@graph": graph               (0..1)
        "@annotation": string         (0..1)
        property-key: property-value / property-value[] /
                      language-map / annotation-map  (*)
    }

value-obj =
    {
        "@context": context-def    (0..1)
        "@value": scalar           (0..1)
        "@language": bcp47-tag / "@type": iri    (0..1)
        "@annotation": string
     }

list-obj =
    {
        "@context": context-def       (0..1)
        "@list": list-set-value / list-set-value[]  (1)
        "@annotation": string         (0..1)
    }

set-obj =
    {
        "@context": context-def       (0..1)
        "@set": list-set-value / list-set-value[]  (1)
        "@annotation": string         (0..1)
    }

language-map =
    {
        "@context": context-def       (0..1)
        bcp47-tag: string / string[]  (*)
    }

annotation-map =
    {
        "@context": context-def       (0..1)
        string: property-value / property-value[]   (*)
    }

list-set-value = scalar / node-obj / value-obj

property-value = list-set-value / list-obj / set-obj

context-def = null / iri / context-def-obj /
              (null / iri / context-def-obj)[]

context-def-obj =
    {
        property-key: null / iri / term-def-obj   (*)
        "@language": bcp47-tag      (0..1)
        "@vocab": iri               (0..1)
    }

term-def-obj =
    {
        "@id": iri    (0..1)
        "@language": bcp47-tag / "@type": iri    (0..1)
        "@container": ( "@list" / "@set" / 
                        "@language" / "@annotation" )   (0..1)
    }

bcp47-tag = string   ; should this be more explicit?

iri = string         ; should this be more explicit?

property-key = string - keyword  ; any string except a keyword

keyword = @context / @id / @value / @language / @type /
          @container / @list / @set / @annotation / @vocab / @graph

scalar = null / string / number / true / false



[1] http://tools.ietf.org/html/draft-zyp-json-schema-03


Cheers,
Markus



--
Markus Lanthaler
@markuslanthaler

Received on Friday, 4 January 2013 17:52:12 UTC