Php/docs/parle.examples.parser

来自菜鸟教程
跳转至:导航、​搜索

Parser examples

Example #1 Simple calculator

<?php use Parle\{Parser, ParserException, Lexer, Token};$p = new Parser;$p->token("INTEGER");$p->left("'+' '-' '*' '/'");$p->push("start", "exp");$prod_add = $p->push("exp", "exp '+' exp");$prod_sub = $p->push("exp", "exp '-' exp");$prod_mul = $p->push("exp", "exp '*' exp");$prod_div = $p->push("exp", "exp '/' exp");$p->push("exp", "INTEGER"); /* Production index unused. */$p->build();$lex = new Lexer;$lex->push("[+]", $p->tokenId("'+'"));$lex->push("[-]", $p->tokenId("'-'"));$lex->push("[*]", $p->tokenId("'*'"));$lex->push("[/]", $p->tokenId("'/'"));$lex->push("\\d+", $p->tokenId("INTEGER"));$lex->push("\\s+", Token::SKIP);$lex->build();$exp = array(    "1 + 1",    "33 / 10",    "100 * 45",    "17 - 45",);foreach ($exp as $in) {    if (!$p->validate($in, $lex)) {        throw new ParserException("Failed to validate input");    }    $p->consume($in, $lex);    while (Parser::ACTION_ERROR != $p->action && Parser::ACTION_ACCEPT != $p->action) {        switch ($p->action) {            case Parser::ACTION_ERROR:                throw new ParserException("Parser error");                break;            case Parser::ACTION_SHIFT:            case Parser::ACTION_GOTO:            case Parser::ACTION_ACCEPT:                break;            case Parser::ACTION_REDUCE:                switch ($p->reduceId) {                    case $prod_add:                        $l = $p->sigil(0);                        $r = $p->sigil(2);                        echo "$l + $r = " . ($l + $r) . "\n";                        break;                    case $prod_sub:                        $l = $p->sigil(0);                        $r = $p->sigil(2);                        echo "$l - $r = " . ($l - $r) . "\n";                        break;                    case $prod_mul:                        $l = $p->sigil(0);                        $r = $p->sigil(2);                        echo "$l * $r = " . ($l * $r) . "\n";                        break;                    case $prod_div:                        $l = $p->sigil(0);                        $r = $p->sigil(2);                    echo "$l / $r = " . ($l / $r) . "\n";                        break;            }            break;        }        $p->advance();    }}

Example #2 Parse words out from a sentence

<?phpuse Parle\{Lexer, Token, Parser, ParserException};$p = new Parser;$p->token("WORD");$p->push("START", "SENTENCE");$p->push("SENTENCE", "WORDS");$prod_word_0 = $p->push("WORDS", "WORDS WORD");$prod_word_1 = $p->push("WORDS", "WORD");$p->build();$lex = new Lexer;$lex->push("[^\s]{-}[\.,\:\;\?]+", $p->tokenId("WORD"));$lex->push("[\s\.,\:\;\?]+", Token::SKIP);$lex->build();$in = "Dis-moi où est ton papa?";$p->consume($in, $lex);do {    switch ($p->action) {    case Parser::ACTION_ERROR:        throw new ParserException("Error");        break;    case Parser::ACTION_SHIFT:    case Parser::ACTION_GOTO:        /* var_dump($p->trace());*/        break;    case Parser::ACTION_REDUCE:        $rid = $p->reduceId();        if ($rid == $prod_word_1) {            var_dump($p->sigil(0));        } if ($rid == $prod_word_0) {            var_dump($p->sigil(1));        }        break;    }    $p->advance();} while (Parser::ACTION_ACCEPT != $p->action);