2015-03-24 5 views
1

При изучении некоторого разбора API-интерфейсов, я побежал в общий метод, используемый для написания функции синтаксического анализа:Резервная часть кода в функциях анализа parse?

final public Query parse() throws ParseException { 
    Query q; 
    // some parsing code using tokens here 

    {if (true) return q;} 
    throw new Error("Missing return statement in function"); 
} 

Я заметил, что это то же синтаксис используется многими парсеры классами

(т.е. org.apache .lucene.queryparser.flexible.standard.parser.StandardSyntaxParser # TopLevelQuery &

http://google-gson.googlecode.com/svn-history/r320/trunk/gson/src/main/java/com/google/gson/JsonParser.java#parse )

и это меня смущает, потому что я не могу прийти к определенному выводу, почему этот кусок кода написан так.

Есть ли что-то скрытое, кроме того, подчеркивая, что оно всегда должно что-то возвращать?

Спасибо заранее,

+1

Этот класс был автогенерирован. Из исходного кода: '/ * Сгенерировано: JavaCC: не редактируйте эту строку. JsonParser.java */'. Я не могу вам сказать, почему * авторы JavaCC решили создать это бесполезное условие. Может быть, вы можете подключить дополнительные условия возврата до генерации? Я также хотел бы знать, почему они выбрали 'throw Error', а не оставить класс с ошибками компиляции, если в результате не было создано' return'. Я предполагаю, что это было создано из кода Javascript, где оператор return является необязательным. Перевод на Java может потребовать такого подхода, но не может понять, почему. –

+0

Сначала код не был написан в обычном смысле, он был сгенерирован, как другие упоминали. Команда 'throw' существует, потому что код не будет компилироваться без него. По крайней мере, компилятор Eclipse дает фатальную ошибку. (Попробуйте удалить эту строку и посмотреть, что произойдет.) Реальный вопрос: почему 'if (true)' там, и для этого у меня нет ответа. Кстати, это не имеет никакого отношения к акценту, потому что вы действительно не должны читать этот файл, кроме случаев, когда есть ошибка, требующая исправления. И это не имеет никакого отношения к JavaScript; Входом JavaCC является файл грамматики JavaCC. –

ответ

1

код автоматически созданное обычно правильно, но вряд ли когда-либо выглядит элегантно. Достаточно сложно создать правильный код, не беспокоясь об элегантности.

Правдоподобные догадки: {существует ли это потому, что в этот момент генератор не знает, понадобится оно ему или нет; он скоро узнает, но «скоро» не «сейчас». Бросок существует, потому что в этот момент генератор не уверен, что он сгенерировал оператор возврата для 100% ввода.