For purposes of forward compatability, all lines which do not match the grammar are labeled as TAPx::Parser::Result::Unknown and are not considered parse errors.
In other words,
test ::= status positiveInteger? description? directive? | unknown unknown ::= {character}
Update: lines is never referenced.
Update: Thinking about the unreferenced lines, I thought of a possible simplification: Requiring one and only one (no more, no less) "plan" line should not be enforced using the grammar. In other words, treat the count of plan lines as a semantic check, not a syntactic check. This leads to a slightly simpler grammar that will be easier to maintain, especially as things are added.
tap ::= lines lines ::= line {lines} line ::= (comment | test | plan | unknown ) "\n" plan ::= '1..' nonNegativeInteger "\n" test ::= status positiveInteger? description? directive? status ::= 'not '? 'ok ' description ::= (character - (digit '#')) {character - '#'} directive ::= '#' ( 'TODO' | 'SKIP' ) ' ' {character} comment ::= '#' {character} unknown ::= {character} digit ::= [:digit:] character ::= ([:print:] - "\n") positiveInteger ::= ( digit - '0' ) {digit} nonNegativeInteger ::= digit {digit}
This doesn't mean it can't be checked at parse-time. Make sure a plan wasn't already specified when one is encountered. Make sure a plan was specified when parsing is done.
In reply to Re: Revised TAP Grammar
by ikegami
in thread Revised TAP Grammar
by Ovid
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |