home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _4dd4c87ece369e0293a067b8fd1071d7 < prev    next >
Text File  |  2000-03-23  |  20KB  |  443 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>Parse::Yapp - Perl extension for generating and using LALR parsers.</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> Parse::Yapp - Perl extension for generating and using LALR parsers.</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <UL>
  26.  
  27.         <LI><A HREF="#the grammar file">The Grammar file</A></LI>
  28.     </UL>
  29.  
  30.     <LI><A HREF="#bugs and suggestions">BUGS AND SUGGESTIONS</A></LI>
  31.     <LI><A HREF="#author">AUTHOR</A></LI>
  32.     <LI><A HREF="#see also">SEE ALSO</A></LI>
  33.     <LI><A HREF="#copyright">COPYRIGHT</A></LI>
  34. </UL>
  35. <!-- INDEX END -->
  36.  
  37. <HR>
  38. <P>
  39. <H1><A NAME="name">NAME</A></H1>
  40. <P>Parse::Yapp - Perl extension for generating and using LALR parsers.</P>
  41. <P>
  42. <HR>
  43. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  44. <UL>
  45. <LI>Linux</LI>
  46. <LI>Solaris</LI>
  47. <LI>Windows</LI>
  48. </UL>
  49. <HR>
  50. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  51. <PRE>
  52.   yapp -m MyParser grammar_file.yp</PRE>
  53. <PRE>
  54.   ...</PRE>
  55. <PRE>
  56.   use MyParser;</PRE>
  57. <PRE>
  58.   $parser=new MyParser();
  59.   $value=$parser->YYParse(yylex => \&lexer_sub, yyerror => \&error_sub);</PRE>
  60. <PRE>
  61.   $nberr=$parser->YYNberr();</PRE>
  62. <PRE>
  63.   $parser->YYData->{DATA}= [ 'Anything', 'You Want' ];</PRE>
  64. <PRE>
  65.   $data=$parser->YYData->{DATA}[0];</PRE>
  66. <P>
  67. <HR>
  68. <H1><A NAME="description">DESCRIPTION</A></H1>
  69. <P>Parse::Yapp (Yet Another Perl Parser compiler) is a collection of modules
  70. that let you generate and use yacc like thread safe (reentrant) parsers with
  71. perl object oriented interface.</P>
  72. <P>The script yapp is a front-end to the Parse::Yapp module and let you
  73. easily create a Perl OO parser from an input grammar file.</P>
  74. <P>
  75. <H2><A NAME="the grammar file">The Grammar file</A></H2>
  76. <DL>
  77. <DT><STRONG><A NAME="item_Comments"><CODE>Comments</CODE></A></STRONG><BR>
  78. <DD>
  79. Through all your files, comments are either Perl style, introduced by <EM>#</EM>
  80. up to the end of line, or C style, enclosed between  <EM>/*</EM> and <EM>*/</EM>.
  81. <P></P>
  82. <DT><STRONG><A NAME="item_Tokens_and_string_literals"><CODE>Tokens and string literals</CODE></A></STRONG><BR>
  83. <DD>
  84. Through all the grammar files, two kind of symbols may appear:
  85. <EM>Non-terminals</EM> symbols, also called <EM>left-hand-side</EM> symbols,
  86. which are the names of your rules, and <EM>Terminal</EM> symbols, also
  87. called <EM>Tokens</EM>.
  88. <P>Tokens are the symbols your lexer function will pass to your parser
  89. (see below). They come in two flavours: symbolic tokens and string
  90. literals.</P>
  91. <P>Non-terminals and symbolic tokens share the same identifier syntax:</P>
  92. <PRE>
  93.                 [A-Za-z][A-Za-z0-9_]*</PRE>
  94. <P>String literals are enclosed in single quotes and can contain almost
  95. anything. They will be output to your parser file double-quoted, making
  96. any special character be as is. '``', '$' and '@' will be automatically
  97. quoted with '\', making their writing more natural. On the other hand,
  98. if you need a single quote inside your literal, just quote it with '\'.</P>
  99. <P>You cannot have a literal <EM>'error'</EM> in your grammar as it would
  100. confuse the driver with the <EM>error</EM> token. Use a symbolic token instead.
  101. Using it anyway will produce a warning telling you you should have wrote
  102. it <EM>error</EM> and will treat it as if it were the <EM>error</EM> token.</P>
  103. <P></P>
  104. <DT><STRONG><A NAME="item_Grammar_file_syntax"><CODE>Grammar file syntax</CODE></A></STRONG><BR>
  105. <DD>
  106. It is very close to yacc's one (in fact, <EM>Parse::Yapp</EM> should compile
  107. a clean <EM>yacc</EM> grammar without any modification, whereas the opposit
  108. is no true).
  109. <P>It is divided in three sections separated by <CODE>%%</CODE>:</P>
  110. <PRE>
  111.         header section
  112.         %%
  113.         rules section
  114.         %%
  115.         footer section</PRE>
  116. <DL>
  117. <DT><STRONG><A NAME="item_The_Header_Section_section_may_contain%3A"><STRONG>The Header Section</STRONG> section may contain:</A></STRONG><BR>
  118. <DD>
  119. <LI>
  120. One ore more code blocks enclosed inside <CODE>%{</CODE> and <CODE>%}</CODE> just like in
  121. yacc. They may contain any valid Perl code and will be copied verbatim
  122. at the very beginning of the parser module. They are not as useful as
  123. they are in yacc, but you may use them, for example, for global variables
  124. declaration, though you will see later that such global variables can
  125. avoided to make reentrant parser modules.
  126. <P></P>
  127. <LI>
  128. Precedence declarations, introduced by <CODE>%left</CODE>, <CODE>%right</CODE> and <CODE>%nonassoc</CODE>
  129. specifying associativity, followed by the list of tokens or litterals
  130. having the same precedence and associativity.
  131. The precedence beeing the later declared have the highest level.
  132. (see the yacc or bison manuals for a full explanation of how they work,
  133. as they are implemented exactly the same way in Parse::Yapp)
  134. <P></P>
  135. <LI>
  136. <CODE>%start</CODE> followed by a rule's left hand side, declaring this rule to
  137. be the starting rule of your grammar. The default if <CODE>%start</CODE> is not
  138. declared is the first rule in your grammar section.
  139. <P></P>
  140. <LI>
  141. <CODE>%token</CODE> followed by a list of symbols, forcing them to be recognized
  142. as tokens, generating a syntax error if used in the left hand side of
  143. a rule declaration.
  144. Note that in Parse::Yapp, you <EM>don't</EM> need to declare tokens as in yacc: any
  145. symbol not appearing as a left hand side of a rule is considered to be
  146. a token.
  147. Other yacc declarations or constructs such as <CODE>%type</CODE> and <CODE>%union</CODE> are
  148. parsed but (almost) ignored.
  149. <P></P>
  150. <LI>
  151. <CODE>%expect</CODE> followed by a number, suppress warnings about number of Shift/Reduce
  152. conflicts when both numbers match, a la bison.
  153. <P></P>
  154. <DT><STRONG><A NAME="item_The_Rule_Section_contains_your_grammar_rules%3A"><STRONG>The Rule Section</STRONG> contains your grammar rules:</A></STRONG><BR>
  155. <DD>
  156. A rule is made of a left-hand-side symbol, followed by a <CODE>':'</CODE> and one
  157. or more right hand sides separated by <CODE>'|'</CODE> and terminated by a <CODE>';'</CODE>:
  158. <PRE>
  159.     exp:    exp '+' exp
  160.         |   exp '-' exp
  161.         ;</PRE>
  162. <P>A right hand side may be empty:</P>
  163. <PRE>
  164.     input:  #empty
  165.         |   input line
  166.         ;</PRE>
  167. <P>(if you have more than one empty rhs, Parse::Yapp will issue a warning,
  168. as this is usually a mistake, and you sure will have a reduce/reduce
  169. conflict)</P>
  170. <P>A rhs may be followed by an optionnal <CODE>%prec</CODE> directive, followed
  171. by a token, giving the rule and explicit precedence (see yacc manuals
  172. for its precise meaning) and optionnal semantic action code block (see
  173. below).</P>
  174. <PRE>
  175.     exp:   '-' exp %prec NEG { -$_[1] }
  176.         |  exp '+' exp       { $_[1] + $_[3] }
  177.         |  NUM
  178.         ;</PRE>
  179. <P>Note that in Parse::Yapp, a lhs <EM>cannot</EM> appear more than once as
  180. a rule name (This differs from yacc).</P>
  181. <P></P>
  182. <DT><STRONG><A NAME="item_The_footer_section"><CODE>The footer section</CODE></A></STRONG><BR>
  183. <DD>
  184. may contain any valid Perl code and will be appended at the very end
  185. of your parser module. Here you can write your lexer, error report
  186. subs and anything relevant to you parser.
  187. <P></P>
  188. <DT><STRONG><A NAME="item_Semantic_actions"><CODE>Semantic actions</CODE></A></STRONG><BR>
  189. <DD>
  190. Semantic actions are run every time a <EM>reduction</EM> occurs in the
  191. parsing flow and they must return a semantic value.
  192. <P>They are (usually, but see below <A HREF="#item_In_rule_actions"><CODE>In rule actions</CODE></A>) written at
  193. the very end of the rhs, enclosed with <CODE>{ }</CODE>, and are copied verbatim
  194. to your parser file, inside of the rules table.</P>
  195. <P>Be aware that matching braces in Perl is much more difficult than
  196. in C: inside strings they don't need to match. While in C it is
  197. very easy to detect the beginning of a string construct, or a
  198. single character, it is much more difficult in Perl, as there
  199. are so many ways of writing such literals. So there is no check
  200. for that today. If you need a brace in a string, quote it (<CODE>\{</CODE> or
  201. <CODE>\}</CODE>) that should work. Or (weird) make a comment matching it. Sorry.</P>
  202. <PRE>
  203.     {
  204.         "{ My string block }".
  205.         "\{ My other string block \}".
  206.         qq/ My unmatched brace \} /.
  207.         #Force the match: {
  208.         q/  My last brace } /
  209.     }</PRE>
  210. <P>All of these constructs should work.</P>
  211. <P>In Parse::Yapp, semantic actions are called like normal Perl sub calls,
  212. with their arguments passed in <CODE>@_</CODE>, and their semantic value are
  213. their return values.</P>
  214. <P>$_[1] to $_[n] are the parameters just as $1 to $n in yacc, while
  215. $_[0] is the parser object itself.</P>
  216. <P>Having $_[0] beeing the parser object itself allows you to call
  217. parser methods. Thats how the yacc macros are implemented:</P>
  218. <PRE>
  219.         yyerrok is done by calling $_[0]->YYErrok
  220.         YYERROR is done by calling $_[0]->YYError
  221.         YYACCEPT is done by calling $_[0]->YYAccept
  222.         YYABORT is done by calling $_[0]->YYAbort</PRE>
  223. <P>All those methods explicitly return <EM>undef</EM>, for convenience.</P>
  224. <PRE>
  225.     YYRECOVERING is done by calling $_[0]->YYRecovering</PRE>
  226. <P>Three useful methods in error recovery sub</P>
  227. <PRE>
  228.     $_[0]->YYCurtok
  229.     $_[0]->YYCurval
  230.     $_[0]->YYExpect</PRE>
  231. <P>return respectivly the current input token that made the parse fail,
  232. its semantic value (both can be used to modify their values too, but
  233. know what you do !) and a list which contains the tokens the parser
  234. expected when the failure occured.</P>
  235. <P>Note that if <CODE>$_[0]->YYCurtok</CODE> is declared as a <CODE>%nonassoc</CODE> token,
  236. it can be included in <CODE>$_[0]->YYExpect</CODE> list whenever the input
  237. try to use it in an associative way. This is not a bug: the token
  238. IS expected to report an error if encountered.</P>
  239. <P>To detect such a thing in your error reporting sub, the following
  240. example should do the trick:</P>
  241. <PRE>
  242.         grep { $_[0]->YYCurtok eq $_ } $_[0]->YYExpect
  243.     and do {
  244.         #Non-associative token used in an associative expression
  245.     };</PRE>
  246. <P>Accessing semantics values on the left of your reducing rule is done
  247. through the method</P>
  248. <PRE>
  249.     $_[0]->YYSemval( index )</PRE>
  250. <P>where index is an integer. Its value beeing <EM>1 .. n</EM> returns the same values
  251. than <EM>$_[1] .. $_[n]</EM>, but <EM>-n .. 0</EM> returns values on the left of the rule
  252. beeing reduced (It is related to <EM>$-n .. $0 .. $n</EM> in yacc, but you
  253. cannot use <EM>$_[0]</EM> or <EM>$_[-n]</EM> constructs in Parse::Yapp for obvious reasons)</P>
  254. <P>There is also a provision for user data area in the parser object,
  255. accessed by the method:</P>
  256. <PRE>
  257.     $_[0]->YYData</PRE>
  258. <P>which returns a reference to an anonymous hash, letting you have
  259. all of your parsing data held inside the object (see the Calc.yp
  260. or ParseYapp.yp files in the distribution for some examples).
  261. That's how you can make you parser module reentrant: all of your
  262. module states and variables are held inside the parser object.</P>
  263. <P>Note: unfortunatly, method calls in Perl have a lot of overhead,
  264.       and when YYData is used, it may be called a huge number
  265.       of times. If your are not a *real* purist and efficiency
  266.       is your concern, you may access directly the user-space
  267.       in the object: $parser->{USER} wich is a reference to an
  268.       anonymous hash array, and then benchmark.</P>
  269. <P>If no action is specified for a rule, the equivalant of a default
  270. action is run, which returns the first parameter:</P>
  271. <PRE>
  272.    { $_[1] }</PRE>
  273. <P></P>
  274. <DT><STRONG><A NAME="item_In_rule_actions"><CODE>In rule actions</CODE></A></STRONG><BR>
  275. <DD>
  276. It is also possible to embbed semantic actions inside of a rule:
  277. <PRE>
  278.     typedef:    TYPE { $type = $_[1] } identlist { ... } ;</PRE>
  279. <P>When the Parse::Yapp's parser encounter such an embeded action, it modifies
  280. the grammar as if you wrote (although @x-1 is not a legal lhs value):</P>
  281. <PRE>
  282.     @x-1:   /* empty */ { $type = $_[1] };
  283.     typedef:    TYPE @x-1 identlist { ... } ;</PRE>
  284. <P>where <EM>x</EM> is a sequential number incremented for each ``in rule'' action,
  285. and <EM>-1</EM> represents the ``dot position'' in the rule where the action arises.</P>
  286. <P>In such actions, you can use <EM>$_[1]..$_[n]</EM> variables, which are the
  287. semantic values on the left of your action.</P>
  288. <P>Be aware that the way Parse::Yapp modifies your grammar because of
  289. <EM>in rule actions</EM> can produce, in some cases, spurious conflicts
  290. that wouldn't happen otherwise.</P>
  291. <P></P>
  292. <DT><STRONG><A NAME="item_Generating_the_Parser_Module"><CODE>Generating the Parser Module</CODE></A></STRONG><BR>
  293. <DD>
  294. Now that you grammar file is written, you can use yapp on it
  295. to generate your parser module:
  296. <PRE>
  297.     yapp -v Calc.yp</PRE>
  298. <P>will create two files <EM>Calc.pm</EM>, your parser module, and <EM>Calc.output</EM>
  299. a verbose output of your parser rules, conflicts, warnings, states
  300. and summary.</P>
  301. <P>What your are missing now is a lexer routine.</P>
  302. <P></P>
  303. <DT><STRONG><A NAME="item_The_Lexer_sub"><CODE>The Lexer sub</CODE></A></STRONG><BR>
  304. <DD>
  305. is called each time the parser need to read the next token.
  306. <P>It is called with only one argument that is the parser object itself,
  307. so you can access its methods, specially the</P>
  308. <PRE>
  309.     $_[0]->YYData</PRE>
  310. <P>data area.</P>
  311. <P>It is its duty to return the next token and value to the parser.
  312. They <CODE>must</CODE> be returned as a list of two variables, the first one
  313. beeing the token known by the parser (symbolic or literal), and the
  314. second one beeing anything you want (usualy the text of the next
  315. token, or the literal value) from a simple scalar value to any
  316. complex reference, as the parsing driver never use it but to call
  317. semantic actions:</P>
  318. <PRE>
  319.     ( 'NUMBER', $num )
  320. or
  321.     ( '>=', '>=' )
  322. or
  323.     ( 'ARRAY', [ @values ] )</PRE>
  324. <P>When the lexer reach the end of input, it must return the <CODE>''</CODE>
  325. empty token with an undef value:</P>
  326. <PRE>
  327.      ( '', undef )</PRE>
  328. <P>Note that your lexer should <EM>never</EM> return <CODE>'error'</CODE> as token
  329. value: for the driver, this is the error token used for error
  330. recovery and would lead to odd reactions.</P>
  331. <P>You now have your lexer written, maybe you will need to output
  332. meaningful error messages, instead of the default which is to
  333. print 'Parse error.' on STDERR.</P>
  334. <P>So you will need an Error reporting sub.</P>
  335. <P>item <CODE>Error reporting routine</CODE></P>
  336. <P>If you want one, write it knowing that it is passed as parameter
  337. the parser object. So you can share information whith the lexer
  338. routine quite easily.</P>
  339. <P></P>
  340. <DT><STRONG><A NAME="item_Parsing"><CODE>Parsing</CODE></A></STRONG><BR>
  341. <DD>
  342. Now you've got everything to do the parsing.
  343. <P>First, use the parser module:</P>
  344. <PRE>
  345.     use Calc;</PRE>
  346. <P>Then create the parser object:</P>
  347. <PRE>
  348.     $parser=new Calc;</PRE>
  349. <P>Now, call the YYParse method, telling it where to find the lexer
  350. and error report subs:</P>
  351. <PRE>
  352.     $result=$parser->YYParse(yylex => \&Lexer,
  353.                            yyerror => \&ErrorReport);</PRE>
  354. <P>(assuming Lexer and ErrorReport subs have been written in your current
  355. package)</P>
  356. <P>The order in which parameters appear is unimportant.</P>
  357. <P>Et voila.</P>
  358. <P>The YYParse method will do the parse, then return the last semantic
  359. value returned, or undef if error recovery cannot recover.</P>
  360. <P>If you need to be sure the parse has been successful (in case your
  361. last returned semantic value <EM>is</EM> undef) make a call to:</P>
  362. <PRE>
  363.     $parser->YYNberr()</PRE>
  364. <P>which returns the total number of time the error reporting sub has been called.</P>
  365. <P></P>
  366. <DT><STRONG><A NAME="item_Error_Recovery"><CODE>Error Recovery</CODE></A></STRONG><BR>
  367. <DD>
  368. in Parse::Yapp is implemented the same way it is in yacc.
  369. <P></P>
  370. <DT><STRONG><A NAME="item_Debugging_Parser"><CODE>Debugging Parser</CODE></A></STRONG><BR>
  371. <DD>
  372. To debug your parser, you can call the YYParse method with a debug parameter:
  373. <PRE>
  374.     $parser->YYParse( ... , yydebug => value, ... )</PRE>
  375. <P>where value is a bitfield, each bit representing a specific debug output:</P>
  376. <PRE>
  377.     Bit Value    Outputs
  378.     0x01         Token reading (useful for Lexer debugging)
  379.     0x02         States information
  380.     0x04         Driver actions (shifts, reduces, accept...)
  381.     0x08         Parse Stack dump
  382.     0x10         Error Recovery tracing</PRE>
  383. <P>To have a full debugging ouput, use</P>
  384. <PRE>
  385.     debug => 0x1F</PRE>
  386. <P>Debugging output is sent to STDERR, and be aware that it can produce
  387. <CODE>huge</CODE> outputs.</P>
  388. <P></P>
  389. <DT><STRONG><A NAME="item_Standalone_Parsers"><CODE>Standalone Parsers</CODE></A></STRONG><BR>
  390. <DD>
  391. By default, the parser modules generated will need the Parse::Yapp
  392. module installed on the system to run. They use the Parse::Yapp::Driver
  393. which can be safely shared between parsers in the same script.
  394. <P>In the case you'd prefer to have a standalone module generated, use
  395. the <CODE>-s</CODE> switch with yapp: this will automagically copy the driver
  396. code into your module so you can use/distribute it without the need
  397. of the Parse::Yapp module, making it really a <CODE>Standalone Parser</CODE>.</P>
  398. <P>If you do so, please remember to include Parse::Yapp's copyright notice
  399. in your main module copyright, so others can know about Parse::Yapp module.</P>
  400. <P></P>
  401. <DT><STRONG><A NAME="item_Source_file_line_numbers"><CODE>Source file line numbers</CODE></A></STRONG><BR>
  402. <DD>
  403. by default will be included in the generated parser module, which will help
  404. to find the guilty line in your source file in case of a syntax error.
  405. You can disable this feature by compiling your grammar with yapp using
  406. the <CODE>-n</CODE> switch.
  407. <P></P></DL>
  408. </DL>
  409. <P>
  410. <HR>
  411. <H1><A NAME="bugs and suggestions">BUGS AND SUGGESTIONS</A></H1>
  412. <P>If you find any bug, think of anything that could improve Parse::Yapp
  413. or have any questions related to it, feel free to contact the author.</P>
  414. <P>
  415. <HR>
  416. <H1><A NAME="author">AUTHOR</A></H1>
  417. <P>Francois Desarmenien  <A HREF="mailto:desar@club-internet.fr">desar@club-internet.fr</A></P>
  418. <P>
  419. <HR>
  420. <H1><A NAME="see also">SEE ALSO</A></H1>
  421. <P><CODE>yapp(1)</CODE> <CODE>perl(1)</CODE> <CODE>yacc(1)</CODE> bison(1).</P>
  422. <P>
  423. <HR>
  424. <H1><A NAME="copyright">COPYRIGHT</A></H1>
  425. <P>The Parse::Yapp module and its related modules and shell scripts are copyright
  426. (c) 1998-1999 Francois Desarmenien, France. All rights reserved.</P>
  427. <P>You may use and distribute them under the terms of either
  428. the GNU General Public License or the Artistic License,
  429. as specified in the Perl README file.</P>
  430. <P>If you use the ``standalone parser'' option so people don't need to install
  431. Parse::Yapp on their systems in order to run you software, this copyright
  432. noticed should be included in your software copyright too, and the copyright
  433. notice in the embedded driver should be left untouched.</P>
  434. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  435. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  436. <STRONG><P CLASS=block> Parse::Yapp - Perl extension for generating and using LALR parsers.</P></STRONG>
  437. </TD></TR>
  438. </TABLE>
  439.  
  440. </BODY>
  441.  
  442. </HTML>
  443.