Есть ли в Eclipse JDT Java Parser какой-либо «линейный посетитель»? Если нет, знает ли кто-нибудь хороший обходной путь? - PullRequest
0 голосов
/ 04 июля 2018

Я хочу посетить узлы в AST из файла Java и извлечь некоторую информацию, связанную с этими узлами. Но я хочу пройти мимо AST, руководствуясь строками в файле исходного кода. Я знаю, что есть информация о линиях, связанных с каждым узлом, но проблема в том, что по умолчанию доступ к узлам осуществляется через определенных посетителей. Итак: 1. чтобы избежать избыточных посещений узлов, 2. не генерировать издержки при попытке перечислить все возможные типы узлов (или посетителей), и 3. для упорядоченного доступа к информации в узлах, мне нужен вид Line Visitor, так что я могу получить доступ к информации в узлах AST, следуя строкам в файле исходного кода. Кто-нибудь знает стандартный способ сделать это с Eclipse JDT API или даже обходной путь?

1 Ответ

0 голосов
/ 04 июля 2018

Я не могу говорить по прямым знаниям Eclipse AST. Однако в той степени, в которой эти являются традиционными AST, просто представленными в Java, в значительной степени способ, которым вы должны посещать узлы дерева в отсутствие какой-либо другой помощи, заключается в обходе дерева.

Конечно, вы, вероятно, можете фильтровать узлы AST по некоторому типу информации о положении файла (строка, столбец, ...), которую Eclipse связывает с такими узлами, и просто фильтровать AST, отмеченные нужной линией. Если вы действительно, действительно не заботитесь о том, сколько времени это займет (в худшем случае линейный размер файла, мой опыт работы с другими системами показывает, что вы получаете ~ 5-7 узлов в среднем на исходную строку), этого должно быть достаточно для ваших целей.

Если вам нужен прямой доступ к узлам дерева, связанным с конкретным номером строки, я думаю, вам не повезло. Очевидно, что вы можете построить такую ​​карту самостоятельно, пройдя по дереву один раз и собрав все узлы, которые имеют определенную строку numbe; тогда вы можете получить доступ, который хотите. [Вам действительно нужно только связать first AST линии (крайний левый в обходе дерева по порядку), чтобы эту карту можно было использовать] Опять же, обход дерева для построения этого списка - линейное время, и вы заплатите его только один раз. Кстати, я создавал инструменты, которые обрабатывают AST в течение ~ 30 лет, и не нашел это особенно полезным.

Если вы настаиваете и хотите снизить стоимость построения этой карты, я бы заглянул внутрь механизма разбора и изменил его для выполнения этой работы. Он производит все эти узлы AST и знает номер строки источника, обрабатываемого при создании такого узла. Построить карту должно быть легко, поскольку генерируются узлы AST. Если ваш синтаксический анализатор хорош, это фактически линейное время, и добавление этой работы не изменит линейность.

...