私はパーサーを学ぼうとしています。私の C スキルはかなり低いので、パーサー ジェネレーターについて学ぶためにPHP Lemonをググってみました。とにかく、ここのコードは通常のレモンの友達にも読めるはずです。
構文解析の質問を処理するときはいつものように、まず簡単な電卓を作成することから始めます。
したがって、私の最初のステップは単純に次のとおりです。
start(A) ::= expr(B). {echo "======RESULT:".A.":".B.":=========".PHP_EOL;}
最初のテストを解析するもの:
include "mysimple.php"; //include the generated Parser
$P = new ParseParser(); //create a Parser object
$P->Parse(ParseParser::VALUE,"13"); // here is the simple test, just understand the Number 13, pls
$P->Parse(0,0); //input is finished, parse!
echo "finished. yeah!".PHP_EOL;
...次の結果へ:
======RESULT:13:=========
finished. yeah!
だから、すべてが期待どおりです。ここで、最終的に操作を処理できるようにするステップの準備を試みますexpression
。
start ::= expr(B). {echo "======RESULT:".B.":=========".PHP_EOL;}
expr ::= VALUE(B). {echo "got a value:".B.PHP_EOL;}
ここで同じテストを実行すると、同じ出力に加えてgot a value: 13
. しかし、私はこれを取得します:
got a value:13
======RESULT::=========
finished. yeah!
さて、何が起こったのですか?結果行が空なのはなぜですか? 明らかに「13」のexpr
a に評価されます。VALUE
レモンは評価を気にしませんか?どういうわけか自分でそれをしなければなりませんか?しかし、この時点で何も得られない場合はどうすればよいでしょうか。