diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:43:11 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 19:43:11 +0000 |
commit | fc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch) | |
tree | ce1e3bce06471410239a6f41282e328770aa404a /upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl | |
parent | Initial commit. (diff) | |
download | manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip |
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl')
-rw-r--r-- | upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl b/upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl new file mode 100644 index 00000000..7955bd22 --- /dev/null +++ b/upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl @@ -0,0 +1,261 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "TAP::Parser::Grammar 3perl" +.TH TAP::Parser::Grammar 3perl 2024-01-12 "perl v5.38.2" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +TAP::Parser::Grammar \- A grammar for the Test Anything Protocol. +.SH VERSION +.IX Header "VERSION" +Version 3.44 +.SH SYNOPSIS +.IX Header "SYNOPSIS" +.Vb 6 +\& use TAP::Parser::Grammar; +\& my $grammar = $self\->make_grammar({ +\& iterator => $tap_parser_iterator, +\& parser => $tap_parser, +\& version => 12, +\& }); +\& +\& my $result = $grammar\->tokenize; +.Ve +.SH DESCRIPTION +.IX Header "DESCRIPTION" +\&\f(CW\*(C`TAP::Parser::Grammar\*(C'\fR tokenizes lines from a TAP::Parser::Iterator and +constructs TAP::Parser::Result subclasses to represent the tokens. +.PP +Do not attempt to use this class directly. It won't make sense. It's mainly +here to ensure that we will be able to have pluggable grammars when TAP is +expanded at some future date (plus, this stuff was really cluttering the +parser). +.SH METHODS +.IX Header "METHODS" +.SS "Class Methods" +.IX Subsection "Class Methods" +\fR\f(CI\*(C`new\*(C'\fR\fI\fR +.IX Subsection "new" +.PP +.Vb 5 +\& my $grammar = TAP::Parser::Grammar\->new({ +\& iterator => $iterator, +\& parser => $parser, +\& version => $version, +\& }); +.Ve +.PP +Returns TAP::Parser grammar object that will parse the TAP stream from the +specified iterator. Both \f(CW\*(C`iterator\*(C'\fR and \f(CW\*(C`parser\*(C'\fR are required arguments. +If \f(CW\*(C`version\*(C'\fR is not set it defaults to \f(CW12\fR (see "set_version" for more +details). +.SS "Instance Methods" +.IX Subsection "Instance Methods" +\fR\f(CI\*(C`set_version\*(C'\fR\fI\fR +.IX Subsection "set_version" +.PP +.Vb 1 +\& $grammar\->set_version(13); +.Ve +.PP +Tell the grammar which TAP syntax version to support. The lowest +supported version is 12. Although 'TAP version' isn't valid version 12 +syntax it is accepted so that higher version numbers may be parsed. +.PP +\fR\f(CI\*(C`tokenize\*(C'\fR\fI\fR +.IX Subsection "tokenize" +.PP +.Vb 1 +\& my $token = $grammar\->tokenize; +.Ve +.PP +This method will return a TAP::Parser::Result object representing the +current line of TAP. +.PP +\fR\f(CI\*(C`token_types\*(C'\fR\fI\fR +.IX Subsection "token_types" +.PP +.Vb 1 +\& my @types = $grammar\->token_types; +.Ve +.PP +Returns the different types of tokens which this grammar can parse. +.PP +\fR\f(CI\*(C`syntax_for\*(C'\fR\fI\fR +.IX Subsection "syntax_for" +.PP +.Vb 1 +\& my $syntax = $grammar\->syntax_for($token_type); +.Ve +.PP +Returns a pre-compiled regular expression which will match a chunk of TAP +corresponding to the token type. For example (not that you should really pay +attention to this, \f(CW\*(C`$grammar\->syntax_for(\*(Aqcomment\*(Aq)\*(C'\fR will return +\&\f(CW\*(C`qr/^#(.*)/\*(C'\fR. +.PP +\fR\f(CI\*(C`handler_for\*(C'\fR\fI\fR +.IX Subsection "handler_for" +.PP +.Vb 1 +\& my $handler = $grammar\->handler_for($token_type); +.Ve +.PP +Returns a code reference which, when passed an appropriate line of TAP, +returns the lexed token corresponding to that line. As a result, the basic +TAP parsing loop looks similar to the following: +.PP +.Vb 10 +\& my @tokens; +\& my $grammar = TAP::Grammar\->new; +\& LINE: while ( defined( my $line = $parser\->_next_chunk_of_tap ) ) { +\& for my $type ( $grammar\->token_types ) { +\& my $syntax = $grammar\->syntax_for($type); +\& if ( $line =~ $syntax ) { +\& my $handler = $grammar\->handler_for($type); +\& push @tokens => $grammar\->$handler($line); +\& next LINE; +\& } +\& } +\& push @tokens => $grammar\->_make_unknown_token($line); +\& } +.Ve +.SH "TAP GRAMMAR" +.IX Header "TAP GRAMMAR" +\&\fBNOTE:\fR This grammar is slightly out of date. There's still some discussion +about it and a new one will be provided when we have things better defined. +.PP +The TAP::Parser does not use a formal grammar because TAP is essentially a +stream-based protocol. In fact, it's quite legal to have an infinite stream. +For the same reason that we don't apply regexes to streams, we're not using a +formal grammar here. Instead, we parse the TAP in lines. +.PP +For purposes for forward compatibility, any result which does not match the +following grammar is currently referred to as +TAP::Parser::Result::Unknown. It is \fInot\fR a parse error. +.PP +A formal grammar would look similar to the following: +.PP +.Vb 4 +\& (* +\& For the time being, I\*(Aqm 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 aware, that\*(Aqs not valid EBNF. Sue me. I +\& didn\*(Aqt know how to write "char" otherwise (Unicode issues). +\& Suggestions welcome. +\& *) +\& +\& tap ::= version? { comment | unknown } leading_plan lines +\& | +\& lines trailing_plan {comment} +\& +\& version ::= \*(AqTAP version \*(Aq positiveInteger {positiveInteger} "\en" +\& +\& leading_plan ::= plan skip_directive? "\en" +\& +\& trailing_plan ::= plan "\en" +\& +\& plan ::= \*(Aq1..\*(Aq nonNegativeInteger +\& +\& lines ::= line {line} +\& +\& line ::= (comment | test | unknown | bailout ) "\en" +\& +\& test ::= status positiveInteger? description? directive? +\& +\& status ::= \*(Aqnot \*(Aq? \*(Aqok \*(Aq +\& +\& description ::= (character \- (digit | \*(Aq#\*(Aq)) {character \- \*(Aq#\*(Aq} +\& +\& directive ::= todo_directive | skip_directive +\& +\& todo_directive ::= hash_mark \*(AqTODO\*(Aq \*(Aq \*(Aq {character} +\& +\& skip_directive ::= hash_mark \*(AqSKIP\*(Aq \*(Aq \*(Aq {character} +\& +\& comment ::= hash_mark {character} +\& +\& hash_mark ::= \*(Aq#\*(Aq {\*(Aq \*(Aq} +\& +\& bailout ::= \*(AqBail out!\*(Aq {character} +\& +\& unknown ::= { (character \- "\en") } +\& +\& (* POSIX character classes and other terminals *) +\& +\& digit ::= [:digit:] +\& character ::= ([:print:] \- "\en") +\& positiveInteger ::= ( digit \- \*(Aq0\*(Aq ) {digit} +\& nonNegativeInteger ::= digit {digit} +.Ve +.SH SUBCLASSING +.IX Header "SUBCLASSING" +Please see "SUBCLASSING" in TAP::Parser for a subclassing overview. +.PP +If you \fIreally\fR want to subclass TAP::Parser's grammar the best thing to +do is read through the code. There's no easy way of summarizing it here. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +TAP::Object, +TAP::Parser, +TAP::Parser::Iterator, +TAP::Parser::Result, |