<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Parser examples</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="parle.examples.lexer.html">Lexer examples</a></div> <div class="next" style="text-align: right; float: right;"><a href="class.parle-lexer.html">Parle\Lexer</a></div> <div class="up"><a href="parle.examples.html">Examples</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="parle.examples.parser" class="section"> <h2 class="title">Parser examples</h2> <div class="example" id="example-5979"> <p><strong>Example #1 Simple calculator</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php <br /><br /></span><span style="color: #007700">use </span><span style="color: #0000BB">Parle</span><span style="color: #007700">\{</span><span style="color: #0000BB">Parser</span><span style="color: #007700">, </span><span style="color: #0000BB">ParserException</span><span style="color: #007700">, </span><span style="color: #0000BB">Lexer</span><span style="color: #007700">, </span><span style="color: #0000BB">Token</span><span style="color: #007700">};<br /><br /></span><span style="color: #0000BB">$p </span><span style="color: #007700">= new </span><span style="color: #0000BB">Parser</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">token</span><span style="color: #007700">(</span><span style="color: #DD0000">"INTEGER"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">left</span><span style="color: #007700">(</span><span style="color: #DD0000">"'+' '-' '*' '/'"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"start"</span><span style="color: #007700">, </span><span style="color: #DD0000">"exp"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$prod_add </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"exp"</span><span style="color: #007700">, </span><span style="color: #DD0000">"exp '+' exp"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$prod_sub </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"exp"</span><span style="color: #007700">, </span><span style="color: #DD0000">"exp '-' exp"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$prod_mul </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"exp"</span><span style="color: #007700">, </span><span style="color: #DD0000">"exp '*' exp"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$prod_div </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"exp"</span><span style="color: #007700">, </span><span style="color: #DD0000">"exp '/' exp"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"exp"</span><span style="color: #007700">, </span><span style="color: #DD0000">"INTEGER"</span><span style="color: #007700">); </span><span style="color: #FF8000">/* Production index unused. */<br /><br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">build</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$lex </span><span style="color: #007700">= new </span><span style="color: #0000BB">Lexer</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"[+]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">tokenId</span><span style="color: #007700">(</span><span style="color: #DD0000">"'+'"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"[-]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">tokenId</span><span style="color: #007700">(</span><span style="color: #DD0000">"'-'"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"[*]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">tokenId</span><span style="color: #007700">(</span><span style="color: #DD0000">"'*'"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"[/]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">tokenId</span><span style="color: #007700">(</span><span style="color: #DD0000">"'/'"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"\\d+"</span><span style="color: #007700">, </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">tokenId</span><span style="color: #007700">(</span><span style="color: #DD0000">"INTEGER"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"\\s+"</span><span style="color: #007700">, </span><span style="color: #0000BB">Token</span><span style="color: #007700">::</span><span style="color: #0000BB">SKIP</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">build</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$exp </span><span style="color: #007700">= array(<br /> </span><span style="color: #DD0000">"1 + 1"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"33 / 10"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"100 * 45"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"17 - 45"</span><span style="color: #007700">,<br />);<br /><br />foreach (</span><span style="color: #0000BB">$exp </span><span style="color: #007700">as </span><span style="color: #0000BB">$in</span><span style="color: #007700">) {<br /> if (!</span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">validate</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">, </span><span style="color: #0000BB">$lex</span><span style="color: #007700">)) {<br /> throw new </span><span style="color: #0000BB">ParserException</span><span style="color: #007700">(</span><span style="color: #DD0000">"Failed to validate input"</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">consume</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">, </span><span style="color: #0000BB">$lex</span><span style="color: #007700">);<br /><br /> while (</span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_ERROR </span><span style="color: #007700">!= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">action </span><span style="color: #007700">&& </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_ACCEPT </span><span style="color: #007700">!= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">action</span><span style="color: #007700">) {<br /> switch (</span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">action</span><span style="color: #007700">) {<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_ERROR</span><span style="color: #007700">:<br /> throw new </span><span style="color: #0000BB">ParserException</span><span style="color: #007700">(</span><span style="color: #DD0000">"Parser error"</span><span style="color: #007700">);<br /> break;<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_SHIFT</span><span style="color: #007700">:<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_GOTO</span><span style="color: #007700">:<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_ACCEPT</span><span style="color: #007700">:<br /> break;<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_REDUCE</span><span style="color: #007700">:<br /> switch (</span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">reduceId</span><span style="color: #007700">) {<br /> case </span><span style="color: #0000BB">$prod_add</span><span style="color: #007700">:<br /> </span><span style="color: #0000BB">$l </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /> echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$l</span><span style="color: #DD0000"> + </span><span style="color: #0000BB">$r</span><span style="color: #DD0000"> = " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$l </span><span style="color: #007700">+ </span><span style="color: #0000BB">$r</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /> break;<br /> case </span><span style="color: #0000BB">$prod_sub</span><span style="color: #007700">:<br /> </span><span style="color: #0000BB">$l </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /> echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$l</span><span style="color: #DD0000"> - </span><span style="color: #0000BB">$r</span><span style="color: #DD0000"> = " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$l </span><span style="color: #007700">- </span><span style="color: #0000BB">$r</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /> break;<br /> case </span><span style="color: #0000BB">$prod_mul</span><span style="color: #007700">:<br /> </span><span style="color: #0000BB">$l </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /> echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$l</span><span style="color: #DD0000"> * </span><span style="color: #0000BB">$r</span><span style="color: #DD0000"> = " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$l </span><span style="color: #007700">* </span><span style="color: #0000BB">$r</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /> break;<br /> case </span><span style="color: #0000BB">$prod_div</span><span style="color: #007700">:<br /> </span><span style="color: #0000BB">$l </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /> echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$l</span><span style="color: #DD0000"> / </span><span style="color: #0000BB">$r</span><span style="color: #DD0000"> = " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$l </span><span style="color: #007700">/ </span><span style="color: #0000BB">$r</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /> break;<br /> }<br /> break;<br /> }<br /> </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">advance</span><span style="color: #007700">();<br /> }<br />}</span> </span> </code></div> </div> </div> <div class="example" id="example-5980"> <p><strong>Example #2 Parse words out from a sentense</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br /></span><span style="color: #007700">use </span><span style="color: #0000BB">Parle</span><span style="color: #007700">\{</span><span style="color: #0000BB">Lexer</span><span style="color: #007700">, </span><span style="color: #0000BB">Token</span><span style="color: #007700">, </span><span style="color: #0000BB">Parser</span><span style="color: #007700">, </span><span style="color: #0000BB">ParserException</span><span style="color: #007700">};<br /><br /></span><span style="color: #0000BB">$p </span><span style="color: #007700">= new </span><span style="color: #0000BB">Parser</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">token</span><span style="color: #007700">(</span><span style="color: #DD0000">"WORD"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"START"</span><span style="color: #007700">, </span><span style="color: #DD0000">"SENTENCE"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"SENTENCE"</span><span style="color: #007700">, </span><span style="color: #DD0000">"WORDS"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$prod_word_0 </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"WORDS"</span><span style="color: #007700">, </span><span style="color: #DD0000">"WORDS WORD"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$prod_word_1 </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"WORDS"</span><span style="color: #007700">, </span><span style="color: #DD0000">"WORD"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">build</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$lex </span><span style="color: #007700">= new </span><span style="color: #0000BB">Lexer</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"[^\s]{-}[\.,\:\;\?]+"</span><span style="color: #007700">, </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">tokenId</span><span style="color: #007700">(</span><span style="color: #DD0000">"WORD"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">push</span><span style="color: #007700">(</span><span style="color: #DD0000">"[\s\.,\:\;\?]+"</span><span style="color: #007700">, </span><span style="color: #0000BB">Token</span><span style="color: #007700">::</span><span style="color: #0000BB">SKIP</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$lex</span><span style="color: #007700">-></span><span style="color: #0000BB">build</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$in </span><span style="color: #007700">= </span><span style="color: #DD0000">"Dis-moi où est ton papa?"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">consume</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">, </span><span style="color: #0000BB">$lex</span><span style="color: #007700">);<br />do {<br /> switch (</span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">action</span><span style="color: #007700">) {<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_ERROR</span><span style="color: #007700">:<br /> throw new </span><span style="color: #0000BB">ParserException</span><span style="color: #007700">(</span><span style="color: #DD0000">"Error"</span><span style="color: #007700">);<br /> break;<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_SHIFT</span><span style="color: #007700">:<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_GOTO</span><span style="color: #007700">:<br /> </span><span style="color: #FF8000">/* var_dump($p->trace());*/<br /> </span><span style="color: #007700">break;<br /> case </span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_REDUCE</span><span style="color: #007700">:<br /> </span><span style="color: #0000BB">$rid </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">reduceId</span><span style="color: #007700">();<br /> if (</span><span style="color: #0000BB">$rid </span><span style="color: #007700">== </span><span style="color: #0000BB">$prod_word_1</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">));<br /> } if (</span><span style="color: #0000BB">$rid </span><span style="color: #007700">== </span><span style="color: #0000BB">$prod_word_0</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">sigil</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /> }<br /> break;<br /> }<br /> </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">advance</span><span style="color: #007700">();<br />} while (</span><span style="color: #0000BB">Parser</span><span style="color: #007700">::</span><span style="color: #0000BB">ACTION_ACCEPT </span><span style="color: #007700">!= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-></span><span style="color: #0000BB">action</span><span style="color: #007700">);</span> </span> </code></div> </div> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="parle.examples.lexer.html">Lexer examples</a></div> <div class="next" style="text-align: right; float: right;"><a href="class.parle-lexer.html">Parle\Lexer</a></div> <div class="up"><a href="parle.examples.html">Examples</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>