<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/parle.examples.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'parle.examples.parser.php',
    1 => 'Пример использования парсера',
    2 => 'Пример использования парсера',
  ),
  'up' => 
  array (
    0 => 'parle.examples.php',
    1 => 'Примеры',
  ),
  'prev' => 
  array (
    0 => 'parle.examples.lexer.php',
    1 => 'Примеры использования лексера',
  ),
  'next' => 
  array (
    0 => 'class.parle-lexer.php',
    1 => 'Parle\\Lexer',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/parle/examples.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="parle.examples.parser" class="section">
  <h2 class="title">Пример использования парсера</h2>
  <div class="example" id="example-1">
   <p><strong>Пример #1 Простой калькулятор</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">/* Индекс производства не используется. */<br /><br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">"Не удалось проверить ввод"</span><span style="color: #007700">);<br />    }<br /><br />    </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</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">-&gt;</span><span style="color: #0000BB">action </span><span style="color: #007700">&amp;&amp; </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">-&gt;</span><span style="color: #0000BB">action</span><span style="color: #007700">) {<br />        switch (</span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</span><span style="color: #0000BB">advance</span><span style="color: #007700">();<br />    }<br />}</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-2">
   <p><strong>Пример #2 Разобрать слова из предложения</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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-&gt;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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</span><span style="color: #0000BB">action</span><span style="color: #007700">);</span></span></code></div>
   </div>

  </div>
 </div><?php manual_footer($setup); ?>