1

私はパーサーを学ぼうとしています。私の 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」のexpra に評価されます。VALUEレモンは評価を気にしませんか?どういうわけか自分でそれをしなければなりませんか?しかし、この時点で何も得られない場合はどうすればよいでしょうか。

4

1 に答える 1

2

次のようなものが欲しくありませんか?

expr(A) ::= VALUE(B). {A = B; echo "got a value:".B.PHP_EOL;}
于 2010-10-23T08:48:57.133 に答える