解析プロジェクトの実装中にこの問題が発生しました。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 ノードのメソッドを記述する必要があります。これは、子ノードにアクセスする一般的な方法がないためです。したがって、一般的なアルゴリズムソリューションを探しています。