📄 parse::recdescent.3
字号:
.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.05).\".\" Standard preamble:.\" ========================================================================.de Sh \" Subsection heading.br.if t .Sp.ne 5.PP\fB\\$1\fR.PP...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...\" Set up some character translations and predefined strings. \*(-- will.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left.\" double quote, and \*(R" will give a right double quote. \*(C+ will.\" give a nicer C++. Capital omega is used to do unbreakable dashes and.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,.\" nothing in troff, for use with C<>..tr \(*W-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'.ie n \{\. ds -- \(*W-. ds PI pi. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch. ds L" "". ds R" "". ds C` "". ds C' ""'br\}.el\{\. ds -- \|\(em\|. ds PI \(*p. ds L" ``. ds R" '''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 turned on, we'll generate index entries on stderr for.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index.\" entries marked with X<> in POD. Of course, you'll have to process the.\" output yourself in some meaningful fashion..ie \nF \{\. de IX. tm Index:\\$1\t\\n%\t"\\$2"... nr % 0. rr F.\}.el \{\. de IX...\}.\".\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2)..\" Fear. Run. Save yourself. No user-serviceable parts.. \" fudge factors for nroff and troff.if n \{\. ds #H 0. ds #V .8m. ds #F .3m. ds #[ \f1. ds #] \fP.\}.if t \{\. ds #H ((1u-(\\\\n(.fu%2u))*.13m). ds #V .6m. ds #F 0. ds #[ \&. ds #] \&.\}. \" simple accents for nroff and troff.if n \{\. ds ' \&. ds ` \&. ds ^ \&. ds , \&. ds ~ ~. ds /.\}.if t \{\. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u". ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'.\}. \" troff and (daisy-wheel) nroff accents.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'.ds 8 \h'\*(#H'\(*b\h'-\*(#H'.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#].ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#].ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#].ds ae a\h'-(\w'a'u*4/10)'e.ds Ae A\h'-(\w'A'u*4/10)'E. \" corrections for vroff.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'. \" for low resolution devices (crt and lpr).if \n(.H>23 .if \n(.V>19 \\{\. ds : e. ds 8 ss. ds o a. ds d- d\h'-1'\(ga. ds D- D\h'-1'\(hy. ds th \o'bp'. ds Th \o'LP'. ds ae ae. ds Ae AE.\}.rm #[ #] #H #V #F C.\" ========================================================================.\".IX Title "Parse::RecDescent 3".TH Parse::RecDescent 3 "2003-04-09" "perl v5.10.0" "User Contributed Perl Documentation".\" 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"Parse::RecDescent \- Generate Recursive\-Descent Parsers.SH "VERSION".IX Header "VERSION"This document describes version 1.94 of Parse::RecDescent,released April 9, 2003..SH "SYNOPSIS".IX Header "SYNOPSIS".Vb 1\& use Parse::RecDescent;\&\& # Generate a parser from the specification in $grammar:\&\& $parser = new Parse::RecDescent ($grammar);\&\& # Generate a parser from the specification in $othergrammar\&\& $anotherparser = new Parse::RecDescent ($othergrammar);\&\&\& # Parse $text using rule \*(Aqstartrule\*(Aq (which must be\& # defined in $grammar):\&\& $parser\->startrule($text);\&\&\& # Parse $text using rule \*(Aqotherrule\*(Aq (which must also\& # be defined in $grammar):\&\& $parser\->otherrule($text);\&\&\& # Change the universal token prefix pattern\& # (the default is: \*(Aq\es*\*(Aq):\&\& $Parse::RecDescent::skip = \*(Aq[ \et]+\*(Aq;\&\&\& # Replace productions of existing rules (or create new ones)\& # with the productions defined in $newgrammar:\&\& $parser\->Replace($newgrammar);\&\&\& # Extend existing rules (or create new ones)\& # by adding extra productions defined in $moregrammar:\&\& $parser\->Extend($moregrammar);\&\&\& # Global flags (useful as command line arguments under \-s):\&\& $::RD_ERRORS # unless undefined, report fatal errors\& $::RD_WARN # unless undefined, also report non\-fatal problems\& $::RD_HINT # if defined, also suggestion remedies\& $::RD_TRACE # if defined, also trace parsers\*(Aq behaviour\& $::RD_AUTOSTUB # if defined, generates "stubs" for undefined rules\& $::RD_AUTOACTION # if defined, appends specified action to productions.Ve.SH "DESCRIPTION".IX Header "DESCRIPTION".Sh "Overview".IX Subsection "Overview"Parse::RecDescent incrementally generates top-down recursive-descent textparsers from simple \fIyacc\fR\-like grammar specifications. It provides:.IP "\(bu" 4Regular expressions or literal strings as terminals (tokens),.IP "\(bu" 4Multiple (non-contiguous) productions for any rule,.IP "\(bu" 4Repeated and optional subrules within productions,.IP "\(bu" 4Full access to Perl within actions specified as part of the grammar,.IP "\(bu" 4Simple automated error reporting during parser generation and parsing,.IP "\(bu" 4The ability to commit to, uncommit to, or reject particularproductions during a parse,.IP "\(bu" 4The ability to pass data up and down the parse tree (\*(L"down\*(R" via subruleargument lists, \*(L"up\*(R" via subrule return values).IP "\(bu" 4Incremental extension of the parsing grammar (even during a parse),.IP "\(bu" 4Precompilation of parser objects,.IP "\(bu" 4User-definable reduce-reduce conflict resolution via\&\*(L"scoring\*(R" of matching productions..ie n .Sh "Using ""Parse::RecDescent""".el .Sh "Using \f(CWParse::RecDescent\fP".IX Subsection "Using Parse::RecDescent"Parser objects are created by calling \f(CW\*(C`Parse::RecDescent::new\*(C'\fR, passing in agrammar specification (see the following subsections). If the grammar iscorrect, \f(CW\*(C`new\*(C'\fR returns a blessed reference which can then be used to initiateparsing through any rule specified in the original grammar. A typical sequencelooks like this:.PP.Vb 3\& $grammar = q {\& # GRAMMAR SPECIFICATION HERE\& };\&\& $parser = new Parse::RecDescent ($grammar) or die "Bad grammar!\en";\&\& # acquire $text\&\& defined $parser\->startrule($text) or print "Bad text!\en";.Ve.PPThe rule through which parsing is initiated must be explicitly definedin the grammar (i.e. for the above example, the grammar must include arule of the form: \*(L"startrule: <subrules>\*(R"..PPIf the starting rule succeeds, its value (see below)is returned. Failure to generate the original parser or failure to match a textis indicated by returning \f(CW\*(C`undef\*(C'\fR. Note that it's easy to set up grammarsthat can succeed, but which return a value of 0, \*(L"0\*(R", or "". So don't betempted to write:.PP.Vb 1\& $parser\->startrule($text) or print "Bad text!\en";.Ve.PPNormally, the parser has no effect on the original text. So in theprevious example the value of \f(CW$text\fR would be unchanged after havingbeen parsed..PPIf, however, the text to be matched is passed by reference:.PP.Vb 1\& $parser\->startrule(\e$text).Ve.PPthen any text which was consumed during the match will be removed from thestart of \f(CW$text\fR..Sh "Rules".IX Subsection "Rules"In the grammar from which the parser is built, rules are specified bygiving an identifier (which must satisfy /[A\-Za\-z]\ew*/), followed by acolon \fIon the same line\fR, followed by one or more productions,separated by single vertical bars. The layout of the productionsis entirely free-format:.PP.Vb 3\& rule1: production1\& | production2 |\& production3 | production4.Ve.PPAt any point in the grammar previously defined rules may be extended withadditional productions. This is achieved by redeclaring the rule with the newproductions. Thus:.PP.Vb 3\& rule1: a | b | c\& rule2: d | e | f\& rule1: g | h.Ve.PPis exactly equivalent to:.PP.Vb 2\& rule1: a | b | c | g | h\& rule2: d | e | f.Ve.PPEach production in a rule consists of zero or more items, each of which may be either: the name of another rule to be matched (a \*(L"subrule\*(R"),a pattern or string literal to be matched directly (a \*(L"token\*(R"), ablock of Perl code to be executed (an \*(L"action\*(R"), a special instructionto the parser (a \*(L"directive\*(R"), or a standard Perl comment (which isignored)..PPA rule matches a text if one of its productions matches. A productionmatches if each of its items match consecutive substrings of thetext. The productions of a rule being matched are tried in the sameorder that they appear in the original grammar, and the first matchingproduction terminates the match attempt (successfully). If allproductions are tried and none matches, the match attempt fails..PPNote that this behaviour is quite different from the \*(L"prefer the longer match\*(R"behaviour of \fIyacc\fR. For example, if \fIyacc\fR were parsing the rule:.PP.Vb 2\& seq : \*(AqA\*(Aq \*(AqB\*(Aq\& | \*(AqA\*(Aq \*(AqB\*(Aq \*(AqC\*(Aq.Ve.PP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -