トップダウン解析の性質上、ANTLR は、式内の葉に到達する前に、多くの余分なノードを含むいくつかの長い反復構造を持つ解析ツリーを生成します。
たとえば、次のコードでC.g4 文法 ( https://github.com/antlr/grammars-v4/tree/master/c ) を使用します。
main(){
int a=5, b=10;
for(int i =0;i<b;i++){
b=a--;
}
}
生成されるツリーは次のとおりです。
(compilationUnit (translationUnit (externalDeclaration (functionDefinition (declarator (directDeclarator (directDeclarator main) ( )))) (compoundStatement { (blockItemList (blockItemList (blockItem (declaration (declarationSpecifiers (declarationSpecifier (typeSpecifier int)))) (initDeclaratorList (initDeclaratorList (initDeclarator (declarator ( directDeclarator a)) = (initializer (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (multiplicativeExpression (castExpression (unaryExpression (postfixExpression (primaryExpression 5)))))))))) )))))))))) ,(initDeclarator (declarator (directDeclarator b)) = (initializer (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (multiplicativeExpression (castExpression (unaryExpression (postfixExpression (primaryExpression 10)))))) ))))))))))))));))) (blockItem (statement (iterationStatement for ( (declaration (declarationSpecifiers (declarationSpecifier (typeSpecifier int)))) (initDeclaratorList (initDeclarator (declarator (directDeclarator i)) = (initializer (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression (exclusiveOrExpression (exclusiveOrExpression)) andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (additiveExpression (multiplicativeExpression (castExpression (unaryExpression (postfixExpression (primaryExpression 0))))))))))))))))) ;) (expression (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (relationalExpression (shiftExpression (additiveExpression (multiplicativeExpression (castExpression (unaryExpression (postfixExpression (primaryExpression i))))))))) < (shiftExpression ( additionalExpression (multiplicativeExpression (castExpression (unaryExpression (postfixExpression (primaryExpression b)))))))))))))))) ;(expression (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression (exclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (multiplicativeExpression (castExpression (unaryExpression (postfixExpression (postfixExpression (primaryExpression i)) ++))))))))) ))))))) ) (ステートメント (compoundStatement { (blockItemList (blockItem (ステートメント (expressionStatement (expression (assignmentExpression (unaryExpression (postfixExpression (primaryExpression b))) (assignmentOperator =) (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression ( を含む) ExclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression(multiplicativeExpression (castExpression (unaryExpression (unaryExpression (postfixExpression (postfixExpression (primaryExpression a)) --))))))))))))))) ;))) })))))) }))) ) )
ここで、コード スタブ "int a=5" に一致するツリーのサブ構造は次のとおりです。
(declaration (declarationSpecifiers (declarationSpecifier (typeSpecifier int))) (initDeclaratorList (initDeclaratorList (initDeclarator (declarator (directDeclarator a)) = (initializer (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (relationalExpression (shiftExpression (additiveExpression) (multiplicativeExpression (castExpression (unaryExpression (postfixExpression (primaryExpression 5))))))))))))))))))))))
これはおおよそ次のように削減できることがはっきりとわかります。
(declaration (declarationSpecifiers (declarationSpecifier (typeSpecifier int))) (initDeclaratorList (initDeclaratorList (initDeclarator (declarator (directDeclarator a)) = (initializer (assignmentExpression (postfixExpression (primaryExpression 5))))))
解析ツリーを使用して特定の静的分析を実行していますが、上記の余分なノードがあるため、システムのリスナー側で多くのチェックを実行して、対象の正しいツリー ノードにアクセスする必要があります。
したがって、一連の変換ルールを使用して余分なノードを削除したり、長い反復構造を減らしたりして、解析ツリーを変更できる簡単な方法があるかどうかを知りたいです。