Предоставляют ли Lex и Yacc оптимизированный код или требуется, чтобы мы писали собственный код вручную для повышения производительности?
Предоставляют ли lex и yacc оптимизированный код?
Ответы (2)
Код, который вы пишете, существенно влияет на скорость, особенно на стороне лексера. Некоторые версии Flex поставляются с полдюжиной (или около того) различных счетчиков слов, большинство из которых написано с помощью Flex, а некоторые написаны вручную — код дает довольно хорошее представление о том, как оптимизировать скорость сканирования (и довольно разумное сравнение что вы можете ожидать от рукописных и машинных лексеров).
Со стороны синтаксического анализатора вы, как правило, немного более ограничены — вы не можете внести столько изменений, не влияя на семантику. Здесь многое зависит от используемого вами генератора синтаксических анализаторов — например, некоторые алгоритмы для грамматик с меньшими ограничениями постоянно производят относительно медленные синтаксические анализаторы, в то время как другие алгоритмы замедляются только для конструкций с меньшими ограничениями и работают относительно быстро, пока входные данные не использует более сложные конструкции.
Yacc производит табличный синтаксический анализатор, который никогда не может быть таким же быстрым, как хорошо написанный вручную синтаксический анализатор. Я не знаю, относится ли то же самое к Лексу.