1

antlr3 が次の例の文法を受け入れるかどうかを尋ねさせてください。

for an input , x + y * z ,
it is parsed as x+(y*z) if each in {x,y,z} is a number;
it is parsed as (x+y)*z if each in {x,y,z} is an object of a particular type T;

そして、そのような文法がコンピューター言語で時々使用されるか、または非常にまれに使用されるかを尋ねさせてください.

どうもありがとうございました。

4

1 に答える 1

3

一般に、パーサー (パーサー ジェネレーターによって生成される) は構文のみをチェックします。

複数の解析を探索できるパーサー (任意の方法で作成) (ANTLR はバックトラッキングによってこれを行うと思います。他の解析エンジン [GLR、Earley] は可能な解析の並列探索によってそれを行います) は、セマンティック チェック情報で拡張された場合、解析を拒否できます。意味上の制約を満たしていませんでした。

私の経験では、ユーザーに説明するのが難しいという理由もあって、人々はそのようなパーサーを構築しない傾向があります。理解できない場合、パーサーは成功していません。あなたの例は、説明可能性の点で特に悪いIMHOです。また、その型情報が必要なため、これを行わない傾向があり、解析時に収集するのが常に便利であるとは限りません。GCC パーサーは、次のようなステートメントを解析するためにこれを行うことで有名です。

   X*T;

パーサーは、この型情報を解析して収集する必要があるため、少し混乱しています。

ANTLR はセマンティック述語をチェックできると思います。これらのセマンティック チェックに対して説明した種類の型情報を取得するのがどれほど簡単かは、別の問題です。ここでの経験はありません。

DMS Software Reengineering Toolkitで使用される GLR 解析エンジンには、「セマンティック」述語があります。アーキテクチャの設計により、これらの述語に実際のセマンティック型情報を取得することは特に簡単ではありません。そのような述語を「構文」から追い出したかったのです。しかし、すべて (型の推論を含む) は構文から外れます。そのため、提案されている削減に純粋にローカルな情報を貼り付けます。これは、ネストされた do 終了と共有された do 終了の次の独特な FORTRAN 構文を、個別のタイプの解析として認識する (認識しない) 場合に特に便利です。

     DO 10  I=1,10,1
        DO 10 J=1,10,1
           A(I,J)=0
 10 CONTINUE
 20 CONTINUE

対。

     DO 20  I=1,10,1
        DO 10 J=1,10,1
           A(I,J)=0
  10 CONTINUE
  20 CONTINUE

パーサーにとって、純粋な構文レベルでは、これらは両方とも次のように見えます。

  DO <INT>  <VAR>=...
        DO <INT> <VAR>=...
           <STMTS>
  <INT> CONTINUE
  <INT> CONTINUE

この情報だけで、どの CONTINUE ステートメントがどの DO コンストラクトに属しているかをどのように判断できますか? できません。

DMS FORTRAN パーサーは、DO ループに 2 つのルール セットを用意することで、これを正確に行います。1 つは非共有継続用、もう 1 つは共有継続用です。これらは、CONTINUE ステートメントのラベルが DO ループ指定のラベルと一致することを確認するセマンティック述語を使用して区別されます。したがって、DMS FORTRAN パーサーは、解析時にループのネストを正しく取得します。私の知る限り、他のすべてのFORTRANコンパイラはステートメントを個別に解析し、ポストパスでDOループのネストをつなぎ合わせます。

そうです、FORTRAN にはこの (紛らわしい) 構造がありますが、私が知っている他の現代の言語はそれをコピーしていません。

于 2012-04-10T07:22:14.620 に答える