summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
commitfc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch)
treece1e3bce06471410239a6f41282e328770aa404a /upstream/debian-unstable/man3/TAP::Parser::Grammar.3perl
parentInitial commit. (diff)
downloadmanpages-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.3perl261
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,