Переменная переименования синтаксического анализатора Java [закрыта]

Мне нужно написать парсер для языка программирования Java. Я видел некоторые реализации (JavaCC, SableCC) и думаю, что справлюсь.

Дело в том, что мне нужно переименовать переменные. Могу ли я сделать это с помощью парсера?

Если да, то как?


person user1019710    schedule 08.03.2012    source источник
comment
Многие IDE имеют такую ​​функциональность рефакторинга: возможно, это вариант?   -  person Bart Kiers    schedule 08.03.2012
comment
Ну, такую ​​вещь мне нужно сделать самому, рефакторинг.   -  person user1019710    schedule 08.03.2012
comment
Но почему вы не используете для этого IDE? Я имею в виду, что найти достойную грамматику и сгенерировать синтаксический анализатор или написать синтаксический анализатор самостоятельно для чего-то, что легко сделать с помощью Eclipse, IntelliJ или Netbeans, довольно сложно.   -  person Bart Kiers    schedule 08.03.2012
comment
Потому что мне нужно реализовать обфускатор для Java. Для этого мне сначала нужен синтаксический анализатор, а затем способ переименовать переменные по всему коду.   -  person user1019710    schedule 08.03.2012
comment
Тогда скажите так во-первых, пожалуйста. Мой следующий вопрос: почему бы вам не использовать существующий обфускатор? Это домашнее задание или какое-то задание? Откровенно говоря, если вы уже столкнулись с проблемами на этой ранней стадии, я не рекомендую писать такие вещи самостоятельно. Никаких обид не имел в виду.   -  person Bart Kiers    schedule 08.03.2012
comment
Ни один не взят. Да, это домашнее задание, и оно еще не начато. Сначала я документирую, но все равно спасибо за вашу поддержку :)   -  person user1019710    schedule 08.03.2012
comment
Если бы я знал, что это вопрос, связанный с домашним заданием (и с самого начала содержал больше справочной информации), я бы не проголосовал за закрытие. Вот SO Q&A, который демонстрирует, как вы можете создать так- называемая островной грамматикой с ANTLR, которая позволит вам сканировать ввод только для (в вашем случае) идентификаторов. Имейте в виду, что при поиске переменной foo вы игнорируете такие вещи, как: class foo { ..., /* foo */ и s = "foo";, если назвать пару крайних случаев.   -  person Bart Kiers    schedule 09.03.2012
comment
Возьмите этот фрагмент кода: package foo; public class foo { int foo; void foo() { foo: for(int foo = 0;;) { /* foo */ System.out.println("foo=" + foo); break foo; } } } , который содержит 10 вхождений foo, но только одно из них является переменной экземпляра.   -  person Bart Kiers    schedule 09.03.2012


Ответы (1)


Вам не нужен синтаксический анализатор, если все, что вы хотите сделать, это глобально переименовать переменные. Все, что вам нужно, это (островной) лексер, который может выбирать идентификаторы, чтобы вы могли их заменить. Вы можете получить такой лексер из любого генератора синтаксических анализаторов, который имеет грамматику Java, просто игнорируя часть синтаксического анализатора. Это должно избавить вас от многих проблем.

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

Если вы хотите переименовать переменные в соответствии с областями, вам нужен синтаксический анализатор, а также разрешение полного имени и типа. Это намного сложнее, чем простой парсер; правила поиска имени в Java 7 довольно сложны. Опять же, существуют генераторы синтаксических анализаторов с грамматиками Java; но в этом случае они не помогут вам, если вы не захотите реализовать это имя и разрешение типа. Вы обнаружите, что работы намного больше, чем вы ожидаете.

person Ira Baxter    schedule 08.03.2012