Как я могу разобрать код для сборки компилятора в Java? - PullRequest
7 голосов
/ 23 марта 2009

Мне нужно написать компилятор. Это домашнее задание в Univ. Преподаватель сказал нам, что мы можем использовать любой API, который мы хотим, для анализа кода, если он хороший. Таким образом, мы сможем больше сосредоточиться на JVM, которую мы будем генерировать.

Так что да, я напишу компилятор на Java для генерации Java.

Знаете ли вы хороший API для этого? Должен ли я использовать регулярные выражения? Обычно я пишу свои парсеры вручную, хотя в этом случае это не рекомендуется.

Любая помощь будет оценена.

Ответы [ 12 ]

13 голосов
/ 23 марта 2009

Regex хорошо использовать в компиляторе, но только для распознавания токенов (т.е. без рекурсивных структур).

Классический способ написания компилятора - лексический анализатор для распознавания токенов, синтаксический анализатор для распознавания структуры, семантический анализатор для распознавания смысла , генератор промежуточного кода , оптимизатор и, наконец, генератор целевого кода . Любой из этих шагов можно объединить или пропустить полностью, если это облегчает написание компилятора.

Для этого процесса было разработано много инструментов. Для Java вы можете посмотреть на

10 голосов
/ 23 марта 2009

Я бы порекомендовал ANTLR , в основном из-за его возможностей генерации выходных данных через StringTemplate.

Что лучше, так это то, что книга Теренса Парра о том же, безусловно, является одной из лучших книг, ориентированных на написание компиляторов с генератором парсера.

Тогда у вас есть ANTLRWorks , который позволяет вам изучать и отлаживать грамматику на лету.

В довершение всего, ANTLR wiki + документация (хотя она и не является достаточно всеобъемлющей, на мой взгляд) - хорошее место для начала для любого новичка. Это помогло мне освежить знания о написании компилятора за неделю.

9 голосов
/ 23 марта 2009

Взгляните на JavaCC , синтаксический анализатор языка для Java. Это очень легко использовать и освоить

6 голосов
/ 23 марта 2009

Go classic - Lex + Yacc. В Java это означает JAX и javacc . Javacc даже имеет несколько грамматик Java , готовых к проверке.

5 голосов
/ 23 марта 2009

Я бы порекомендовал использовать метакомпилятор, такой как ANTLR , или простую комбинатор синтаксического анализа . Функциональная Java имеет API комбинатора синтаксического анализа . Там также JParsec . Оба они основаны на библиотеке Parsec для Haskell .

3 голосов
/ 23 марта 2009

JFlex - это сканер-генератор, который, согласно руководству , предназначен для работы с генератором парсера CUP .

Одной из основных целей разработки JFlex было сделать взаимодействие с бесплатным генератором синтаксического анализатора Java CUP настолько простым, насколько это возможно [sic].

Он также имеет поддержку для BYACC / J , которая, как следует из названия, является портом Berkeley YACC для генерации кода Java.

Я использовал сам JFlex и мне понравилось. Тем не менее, проект, который я делал, был достаточно прост, и я написал парсер вручную, поэтому я не знаю, насколько хорош CUP или BYACC / J.

2 голосов
/ 23 марта 2009

Парсер комбинаторов - хороший выбор. Популярная реализация Java - JParsec.

2 голосов
/ 23 марта 2009

Я использовал SableCC в своем курсе по компилятору, но не по выбору.

Я помню, что нашел его очень громоздким и тяжелым, с большим акцентом на чистоту, а не на удобство (без приоритета оператора или чего-либо; вы должны указать это в грамматике).

Я бы, наверное, хотел использовать что-то другое, если бы у меня был выбор. Мой опыт работы с yacc (для C) и happy (для Haskell) был приятным.

1 голос
/ 23 января 2010

http://java -source.net / open-source / parser-generators и http://catalog.compilertools.net/java.html содержат каталоги инструментов для этого. Сравните также вопрос Stackoverflow Альтернативы регулярным выражениям .

1 голос
/ 23 марта 2009

Я предлагаю вам взглянуть на источник BeanShell. Он имеет компилятор для Java и довольно прост для чтения.

...