1

解析プロジェクトの実装中にこの問題が発生しました。Eclipse JDT を使用して構文解析を行ったところ、構文解析された抽象構文ツリーが得られました。

また、どのトークンがどの AST ノードに属しているかなど、トークン情報も必要です。JDT では直接的な情報が得られず、同じ概念を C ファミリ コードに移植する必要があるため、アルゴリズムを使用して解決することを好みます。

この問題は、よりアルゴリズム的に説明できます。

各 AST ノードには、ソース コードに開始オフセットと終了オフセットがあります。AST の特性により、各ノードのリージョンは境界を越えません。(式 1->20 と 4->23 からの別のステートメントはありませんが、ノード 1->20 と別のノード 1->20 を持つことは可能です)

各トークンには開始オフセットと長さもあります。非交差境界プロパティは引き続き保持されます。また、各トークンは他のトークンと重複しません。

AST とトークンのリストが手元にあり、各トークンを AST ノード、最も狭い領域を持つがトークン全体を含む AST ノードに一致させたいと考えています。非交差性のため、各トークンの開始オフセットのみを確認し、最も狭い領域を持つ AST ノードを見つけることができました。

たとえば、ステートメントがある場合int a = (3 * (5 + b));、トークン ストリームはint, a, =, (, 3, *, (, 5, +, ASTは次のようになりますb));

statement
  |
assignment
  |    | 
id    expression 1
       |
      binary operation
       |        |
       int      expression 2
                 |
               binary operation
                 |       | 
                int       id

次に、ステートメントに属し、内部に属し、2 番目の式intに属します。;b()

手元に AST がありますが、それを使用して特定の AST ノードを検索するには、Java 言語のすべての種類の ast ノードのメソッドを記述する必要があります。これは、子ノードにアクセスする一般的な方法がないためです。したがって、一般的なアルゴリズムソリューションを探しています。

4

1 に答える 1