6

私はパーサージェネレーターを初めて使用し、JSP/ASP/PHP などの組み込み言語の ANTLR 文法がどのように見えるか疑問に思っていますが、残念ながら ANTLR サイトはそのような文法ファイルを提供していません。

より正確には、すべて (コード ブロックの外では意味を持たないキーワードを含む) に一致する AnyText トークンを定義する方法が正確にはわかりませんが、ブロック内でそれらを正しく認識できます。

たとえば、次の切り取りは、AnyText、BlockBegin、Keyword、BlockEnd、AnyText のようにトークン化する必要があります。

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet

私のニーズにより適した別のパーサージェネレーターもあるかもしれません。ここstackoverflowで非常に人気があるため、私はこれまでANTLRしか試していません:)

よろしくお願いします!

4

2 に答える 2

3

別のレクサー/パーサーを使用しているため、ANTLRについて話すことはできません(DMS Software Reengineering Toolkit、そのために私はそのようなJSPおよびPHPレクサー/パーサーを正確に開発しました。(ASPは、質問で観察したように違いはありません)。

しかし、基本的な考え方は、「anytext」を取得しているときと「実際の」プログラミング言語テキストを処理しているときを認識するために、字句解析器が字句モードを必要とするということです。そのため、HTML テキストを吸収し、PHP への遷移に遭遇したときにモードを切り替える HTML などの開始レキシカル モードが必要です。また、すべての PHP トークンを取得し、トランジション アウト文字が検出されたときに HTML モードに切り替える PHP モードも必要です。ここにスケッチがあります:

%%HTML -- mode
#token HTMLText "~[]* \< \% "
   << (GotoPHPMode) >>

%%PHP -- mode
#token KEYWORD "KEYWORD"
...
#token '%>'  "\%\>"
   << (GotoHTMLMode) >>

レクサージェネレーターには、これの代わりに使用する必要があるある種のモード切り替え機能がある可能性があります。そして、HTML の内容を字句解析することは、見た目よりも複雑であることがわかるでしょう (<SCRIPT タグやその他のクレイジーな HTML の多くについて心配する必要がありますが、それらは処理できると思われる詳細です。

于 2009-09-28T04:20:06.943 に答える
1

PHP を解析するための ANTLR 文法ファイルも含まれているこのプロジェクトhttp://code.google.com/p/phpparser/に出くわしました: http://code.google.com/p/phpparser/source/browse/文法/Php.g

お役に立てれば。

于 2011-01-24T03:33:32.333 に答える