2013-07-30 2 views
1

Итак, я хотел бы добавить методы в подклассы SimpleNode. Например, у меня есть узел позиции. После запуска jjt и javacc будет создана Position.java. Ожидается, чтоJJTree добавлять методы к классам узлов

class Position extends SimpleNode { 
    private int line, column; // I'll add private members here 
    ... 
    public int getLine() { 
     return this.line; 
    } // add some methods here 
    ... 
} 

Теперь я вношу изменения в сгенерированные java-файлы. Однако это не очень хорошая идея, так как сгенерированные java-файлы часто удаляются, а файл jjt повторно создается. Можно ли добавить эти объявления в файл jjt (я не нашел что-то подобное в руководстве)? Я также думаю о выводе подклассов из них. Это тоже не работает.

+0

Вы используете переменные 'NODE_CLASS' в своих настройках? См. Https://javacc.java.net/doc/JJTree.html –

+0

Да. Однако классы узлов успешно сгенерированы. Проблема в том, что я не хочу их модифицировать. –

ответ

3

Вы можете изменить реализации узлов, которые вам нравятся. JJTree будет генерировать их только в том случае, если они отсутствуют. От the manual

Если вы не предоставляете реализации классов узлов, JJTree будет генерировать примеры реализаций на основе SimpleNode для вас. Затем вы можете модифицировать реализации.

+0

Спасибо! Это полезно. Я спрашивал, как мне любопытно, есть ли способ не изменять вещи, созданные Makefile в любом случае. Мое текущее решение - хранить все, что я хочу добавить, используя 'jjtSetValue' в поле значений узла. –

+0

Ну обязательно; В своем файле make вы можете удалить сгенерированные файлы, запустить JJTree для их регенерации, а затем модифицировать полученные файлы с помощью sed или awk или что-то еще перед компиляцией. Это кажется более сложным, чем нужно. Что я делаю, это редактировать сгенерированные файлы и проверять их в исходном репозитории. Единственная опасность заключается в том, что когда есть новая версия JJTree, ваши файлы узлов, созданные старой версией, не будут совместимы; Я бы сказал, что есть мало шансов на это. Я имел это случилось с ParseException, но я не думаю, что это произойдет с классами узлов. –