Мне нужно написать парсер для языка программирования Java. Я видел некоторые реализации (JavaCC, SableCC) и думаю, что справлюсь.
Дело в том, что мне нужно переименовать переменные. Могу ли я сделать это с помощью парсера?
Если да, то как?
Мне нужно написать парсер для языка программирования Java. Я видел некоторые реализации (JavaCC, SableCC) и думаю, что справлюсь.
Дело в том, что мне нужно переименовать переменные. Могу ли я сделать это с помощью парсера?
Если да, то как?
Вам не нужен синтаксический анализатор, если все, что вы хотите сделать, это глобально переименовать переменные. Все, что вам нужно, это (островной) лексер, который может выбирать идентификаторы, чтобы вы могли их заменить. Вы можете получить такой лексер из любого генератора синтаксических анализаторов, который имеет грамматику Java, просто игнорируя часть синтаксического анализатора. Это должно избавить вас от многих проблем.
Если попробовать использовать для этого парсер, который строит AST, то будет несложно определить идентификаторы (будут узлы дерева IDENTIFIER) и, возможно, даже заменить их, разбив узлы дерева. Ваша проблема будет заключаться в восстановлении легального исходного текста. Большинство генераторов синтаксических анализаторов не предоставляют возможности преобразования текста в дерево в текст.
Если вы хотите переименовать переменные в соответствии с областями, вам нужен синтаксический анализатор, а также разрешение полного имени и типа. Это намного сложнее, чем простой парсер; правила поиска имени в Java 7 довольно сложны. Опять же, существуют генераторы синтаксических анализаторов с грамматиками Java; но в этом случае они не помогут вам, если вы не захотите реализовать это имя и разрешение типа. Вы обнаружите, что работы намного больше, чем вы ожидаете.
foo
вы игнорируете такие вещи, как:class foo { ...
,/* foo */
иs = "foo";
, если назвать пару крайних случаев. - person Bart Kiers   schedule 09.03.2012package 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