Based on what I've gleaned from
http://search.cpan.org/~petdance/Test-Harness-2.56/lib/Test/Harness/TAP.pod#Diagnostics,
here's a first pass at an EBNF grammar for TAP. Note that it's
incomplete, but it should be a good start for folks to at least think
about this.
Cheers,
Ovid
(*
For the time being, I'm cheating on the EBNF by allowing
certain terms to be defined by POSIX character classes by
using the following syntax:
digit ::= [:digit:];
As far as I am away, that's not valid EBNF. Sue me. I
didn't know how to write "char" otherwise (Unicode issues).
Suggestions welcome.
*)
(* POSIX character classes and other terminals *)
digit ::= [:digit:];
character ::= [:print:];
positiveNumber ::= (digit - '0') {digit};
(* And on to the real grammar ... *)
(* "plan => $num" versus "no_plan" *)
tap ::= plan tests | tests plan;
plan ::= '1..' positiveNumber;
(* Gotta have at least one test *)
tests ::= test {test};
(*
The "positiveNumber" is the test number and should
always be one greater than the previous test number.
*)
test ::= status (positiveNumber description)? directive;
status ::= 'not '? 'ok ';
(*
Description must not begin with a digit or contain a
hash mark.
*)
description ::= (character - (digit '#')) {character - '#'};
directive ::= ???