A Larger Example

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>