2

私は私たちのサイトのユーザー向けのメッセージングシステムを書いています。これは、個々のメッセージがユーザーの動的セグメントをターゲットにできるようにセグメンテーションを実装しています。特定のメッセージのセグメント定義には複数の個別のセグメント一致が含まれる場合があるため、メッセージ本文のコンテンツもセグメント化する必要があります。はるかに経験豊富なプログラマーとの偶然の会話がレクサーとパーサージェネレーターを調べることを提案するまで、私はカスタムレクサー/パーサーであることが判明したものを(レクサーやパーサーについてさえ知らずに)書くことによってこれを試みました。少し調べてみたところ、私が書いているコードはPHPであるため、PHPネイティブのLimeパーサージェネレーターが私の最良の選択肢であることがわかりました。

電卓の例の文法ファイルとメタグラマーを調べましたが(実際、ほとんどのソースコードの分析に数時間を費やしました)、構築方法に頭を悩ませています。単純な文法ファイルですら。レモンや他のPGの文法定義ではなく、独自の文法定義のように見える、ライム専用の文法ファイルの例を知っている人はいますか。

あなたが喜んで具体的な例を提供できるのであれば、私は具体的に次のような形式で条件文を書こうとしています。

This is a text block all users will see.

{{IF user.modules.sms}}
This is a text block only visible to users with the sms module enabled
{{/IF}}

{{IF user.modules.anothermodule AND user.previouslogin < (now() - 3600)}}
This is a text block only visible to users with the anothermodule module enabled, whose previous login was more than an hour ago
{{/IF}}

または、一般的に、そのような機能を実装する他の可能な方法について誰かが提案を持っている場合、私はアドバイスを歓迎します!これらのメッセージを書く人はプロジェクトマネージャーとマーケターになるので、PHPを使用することはできないことを覚えておいてください。

4

2 に答える 2

1

lex と yaccを使用して C プログラムを作成した 90 年代半ば以降、私はパーサー ジェネレーターの作業を行っていませんが、2012 年以降、満足のいく回答が得られなかったり、質問を更新したりしていないことがわかったため、これを提供します。

一般に、パーサー ジェネレーターに PHP コードを出力させたい場合は、yacc の代わりにlimeを使用しても問題ないように見えますが、電卓の例に示されている tokenize() メソッドは、lex の代わりとしては非常に弱いものです。したがって、一般に、プログラミング ロジックのビットを「メッセージ」内に埋め込むことが目標である場合、トークナイザー ロジックを「ゼロから」作成することは困難であることが予想されます (メッセージ形式が非常に制約されている場合は、それほど困難ではありません)。

しかし、提案されたメッセージの例は、より大きな問題を提起します:

パーサー ジェネレーターによって出力される PHP コードは、どの程度正確に使用されますか?

具体的には:

  • パーサーによって生成されたコードのこれらのチャンクは、「スタンドアロン」の Web ページになりますか? URL を介して直接アドレス指定でき、Web サーバーによって直接レンダリングされます (この場合、次の問題は、Web サーバーに PHP コードを実行するように指示する方法です。それらを CGI スクリプトに変換します)? それとも、ある種のアプリケーション フレームワーク (または「メッセージ レンダラー」) 内で実行されますか?

  • (PHP)プログラムの状態はどのように保持されますか? あなたの例は「user.previouslogin」を参照しています。これは、ページビューだけでなく、ある種の「セッション」にも永続性があることを示唆しています。

  • タグ内のメッセージに埋め込むことを提案しているロジックは、実際に PHP や Javascript の変形でしょうか、それとも真に新しいものでしょうか?

静的ページ内にロジックを埋め込むことは古い考えです (結局、サーバー サイド インクルードは 90 年代に人気がありました)。最新のテンプレート エンジン (Ugo Meda の回答で示唆されているように) は非常に強力です。独自のメッセージ解析 + レンダリング システムをロールすることが本当に意味があるかどうかは、例で「user.modules.*」を記述するときに参照しているアプリケーション コンテキストによって課せられる制約に依存します。

于 2014-01-29T14:56:54.950 に答える
0

車輪を再発明しないでください。これを実装するには、 Smartyなどを使用する必要があるかもしれません。これは危険なコードを実行するため、信頼できるユーザーが使用する必要があります。

何百もの機能を実装する予定がない場合は、適切な正規表現でうまくいくはずです。

于 2012-07-05T10:14:57.927 に答える