30

PHPにLexとYaccの実装はありますか?

そうでない場合は、PHPコードを作成する字句アナライザーとパーサージェネレーター(つまり、LexやYaccなど)を提案できますか?結果として得られるパーサーのパフォーマンスについてはあまり心配していません。

正規表現で解析すべきではないものを正規表現で解析することにうんざりしています...

4

4 に答える 4

8

JLexPHPがあります:https ://github.com/wez/JLexPHP/blob/master/jlex.php

私はそれを使用していませんが、これがあります:http: //pear.php.net/package/PHP_ParserGenerator、これはレモン文法からPHPパーサーを作成します。ただし、プロジェクトは非アクティブのようです。

私はこのプロジェクトも見つけました:http ://code.google.com/p/antlrphpruntime/ 、これはAntlrを使用しています。しかし、再び非アクティブです。

于 2010-01-19T12:02:59.793 に答える
1

チープトリック:再帰下降パーサーをコーディングします。これは多くの場合をカバーします。8ビット組み込みシステムで使用できるフレックス/バイソンの代替手段はありますか?を参照してください 。

于 2011-11-03T22:38:23.713 に答える
1

しばらくの間、この種のものを探していました。この投稿を見つけた後、ANTLR PHP ランタイムを試しました。完成にはほど遠いと報告できます。生成されたコードにはいくつかのエラーがあり、元の Java ランタイム クラスが PHP に適切に変換されていません (クラス メソッド演算子にアクセスしようとするときに、'.' の代わりに '.' を使用するネストされたクラス宣言)。

ANTLR フレームワーク自体は非常に強力です (生成されたコードの効率を証明することはできません)。特に、グラフィカル ツール ANTLRWorks を使用すると、文法の作成とデバッグが簡単になります。PHPのバージョンについては残念です。ただし、自分でロールすることは可能です。最適な解決策は、生成された ANTLR ランタイム クラスを分析し、それがどのように機能するかを理解し、軽量でエンタープライズ向けではないバージョンを考え出すことです。

于 2010-02-02T16:46:09.107 に答える
0

別の提案: Lex/Yacc アプローチを避け、PHP を優れた文字列パーサーとして使用する。

  • 単純なタスクと単純な翻訳者の場合: PHPpreg_*関数で perl 正規表現 (PCRE) を使用します。コールバックには、Awk または Yacc ルールと同じ機能がありますが、PHP コード (!) を使用します。

  • 複雑なタスクの場合: (PHP 文字列または PCRE トランスレーターまたは別のトランスレーターを使用して) 言語を XML 方言に翻訳し、DOMおよび/またはXSLTで処理します。XSLT は、Yacc のように「ルール指向」(xsl:template を参照) です。XSLT を使用すると、 registerphpfunctions() を使用して PHP 関数にアクセスすることもできます。非 XML 言語または I/O 複合形式に戻す必要がある場合は、出力 (保存された XMLまたは XSLT 出力) を PCRE および文字列関数で再度処理します。

    • PS: よりリッチで複雑な言語の場合、「XML への変換」タスクは可能ですが ( xSugar 理論を参照)、必ずしも簡単ではありません。PHP-PEGを使用して PHP で翻訳するか、外部ツールを使用して翻訳して、XML をキャッシュするか、特定の言語スクリプトの永続的な xml 翻訳バージョンを使用することができます。

これら 2 つのオプション (Lex と Yacc) は同じ能力を持ち、組み込みの PHP クラスと関数のみを使用します。

複雑なケースでは、XML、XSLT などは W3C 標準であり、XML の方言は「標準形式」であり、XML ツールは最適化されており、まだ進化しており、XML データは交換可能であることを思い出してください。

于 2012-07-25T11:15:27.193 に答える