Как мне проанализировать код для создания компилятора на Java?

StackOverflow https://stackoverflow.com/questions/672577

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Я бы посоветовал АНТЛР, в первую очередь из-за его возможностей генерации вывода через StringTemplate.

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

Тогда у вас есть ANTLRРаботает что позволяет вам изучать и отлаживать грамматику на лету.

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

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

Классика — Lex + Yacc.На Java это пишется ДЖАКС и javacc.У Javacc даже есть некоторые Java-грамматики готов к проверке.

Я бы рекомендовал использовать либо метакомпилятор, например АНТЛР, или простой парсер-комбинатор библиотека. Функциональная Java имеет API комбинатора парсера.Есть также ДжПарсек.Оба они основаны на библиотека Parsec для Haskell.

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

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

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

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

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

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

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

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

Если вы собираетесь пойти на хардкор, добавьте немного http://llvm.org в смеси :)

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

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

С помощью синтаксического анализатора комбинатор, как JParsec . Там в хороший видео-учебник о том, как использовать его .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top