Imagine you were defining a textual format for XForms [xf]:
Example XForm
style xform.css
model M
instance data data.xml
submission save put:data.xml replace:none
input name "What is your name?"
submit "OK"
This is going to need definitions for CSS, URIs, XPath, and a lot more. Furthermore, it would be worth modularising it into several parts that are effectively independent, reflecting the model-view-controller aspect of XForms: the model, the content, and actions. This might result in a grammar like this (this is not a complete example).
The top-level:
+uses form from form.ixml
+uses content from content.ixml
xform>html: h, form, content.
@h>xmlns: +"http://www.w3.org/1999/xhtml".
Module form.ixml:
+shares form
+uses css from css.ixml;
model from model.ixml;
iri from iri.ixml;
s from xforms-basics.ixml
form>head: title, styling?, model*.
title: ~[" "; #a], ~[#a]+, -#a.
-styling: -"style", s, (style; stylelink).
stylelink>link: csstype, cssrel, href.
style: csstype, css.
@csstype>type: +"text/css".
@cssrel>rel: +"stylesheet".
@href: -iri, s.
Module model.ixml:
+shares model
+uses s, ref, xf from xforms-basics.ixml;
id, name from xml.ixml;
Action from action.ixml;
iri from iri.ixml
model: -"model", s, id, s, xf, -#a,
s, (instance; bind; submission; Action)+.
instance: -"instance", s, id, s, resource, s.
@resource: -iri.
bind: "bind", s, (id, s)?, ref, s, property*.
property: type {; readonly; relevant; required; etc}.
type: "type:", name, s.
submission: -"submission", s, id, s,
(method, -":", resource, s)?, replace?.
@method: "get"; "put".
@replace: -"replace:", name, s.
{etc}
Module content.ixml:
+shares content
+uses IDREF from xml.ixml;
xf, ref, string, s from xforms-basics.ixml
content>body: group.
group: xf, control*.
-control: input; submit {more}.
input: -"input", s, ref, label.
label: string.
submit: -"submit", s, subid?, label?.
@subid>submission: -"submission:", IDREF, s.
and so on. Giving output like:
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>Example XForm</title>
<link type='text/css' rel='stylesheet' href='xform.css'/>
<model id='M' xmlns='http://www.w3.org/2002/xforms'>
<instance id='data' resource='data.xml'/>
<submission id='save' method='put' resource='data.xml' replace='none'/>
</model>
</head>
<body>
<group xmlns='http://www.w3.org/2002/xforms'>
<input ref='name'>
<label>What is your name?</label>
</input>
<submit>
<label>OK</label>
</submit>
</group>
</body>
</html>