grammar TraceInMarkdown

rule top
    (document '' )
    {def getLabel ; "top" ; end}
end

rule document
   ( (noMarkupText / trace / markupAbort)*  '')
    {def getLabel ; "document" ; end}
end

rule noMarkupText
   [^\[]+  { def as_xml; wrap('noMarkupText',super); end } 
end

rule markupAbort
   "["     
end

    rule trace
            traceId s? traceHead s? traceBody uptraces:traceUpLink  
             {def getLabel ; "trace" ; end} 
    end

    rule traceId 
       ("[" / "\\[") payload:label ("]" / "\\]")
    end

    rule label
            [a-zA-Z]+ ("_" / "\\_") [a-zA-Z]+ ("_" / "\\_") [0-9]+
    end

    rule traceHead
             '**' payload:(!'*' . / '\*')+ '**' 
    end

    rule traceBody
       "{" payload:(nestedBody / [^{}])+ "}" 
    end

    rule nestedBody
       "{" (nestedBody / [^{}])+ "}" 
    end

    rule traceUpLink
        "(" payload:(","? s? label)* ")" 
    end

rule s
   [\s]+  
end

end