Разбор, где я могу узнать об этом
Мне дали работу по "переводу" одного языка на другой. Источник слишком гибкий (сложный) для простого построчного подхода с регулярным выражением. Где я могу узнать больше о лексическом анализе и парсерах?
12 ответов
Если вы хотите проявить "эмоциональность" по этому вопросу, возьмите копию " Книги Дракона". Обычно это текст в курсе дизайна компилятора. Он определенно удовлетворит вашу потребность "узнать больше о лексическом анализе и парсерах", а также кучу других забавных вещей!
IMH (umble) O, спаси себе руку и / или ногу и купи старую версию - она исполнит твои информационные желания.
Попробуйте ANLTR:
ANTLR, ANother Tool for Language Recognition, является языковым инструментом, который обеспечивает основу для конструирования распознавателей, интерпретаторов, компиляторов и переводчиков из грамматических описаний, содержащих действия на различных целевых языках.
Есть книга для этого также.
Книга Никлауса Вирта "Построение компилятора" (доступна в виде бесплатного PDF) http://www.google.com/search?q=wirth+compiler+construction
Многие люди рекомендовали книги. Для многих это гораздо более полезно в структурированной среде с назначениями и сроками и так далее. Даже если нет, материал, представленный по-другому, может сильно помочь.
а) Рассматривали ли вы посещение школы с достойной учебной программой CS?
(б) Есть много онлайн-лекций, таких как MIT's Open Courseware. В их разделе EE/CS есть много курсов, которые касаются синтаксического анализа, хотя я не вижу ни одного курса синтаксического анализа как такового. Обычно он вводится как один из первых теоретических курсов, поскольку классификация языков и автоматов лежит в основе большей части теории КС.
Недавно я работал с PLY, который является реализацией lex и yacc в Python. С ним довольно легко начать работу, и в документации есть несколько простых примеров.
Разбор может быстро стать очень технической темой, и вы обнаружите, что вам, вероятно, не нужно будет знать все детали алгоритма синтаксического анализа, если вы используете конструктор парсера, такой как PLY.
Я нашел этот сайт полезным:
Учебник для начинающих Lex и YACC /HOWTO
Впервые я использовал lex/yacc для относительно простого проекта. Этот урок был всем, что мне действительно нужно. Когда позже я подошел к более сложным проектам, знакомство с этим уроком и простой проект позволили мне создать что-то более необычное.
Lexing/Parsing + typecheck + генерация кода - отличное упражнение для CS. Я бы порекомендовал его всем, кто хочет иметь прочную основу, поэтому я весь в Dragon Book
Техника синтаксического анализа - практическое руководство Дика Груна и Чериэля Дж. Х. Джейкобса
Эта книга (свободно доступная в формате PDF) дает обширный обзор различных методов / алгоритмов синтаксического анализа. Если вы действительно хотите понять различные алгоритмы синтаксического анализа, этот IMO является лучшим справочником, чем Книга Дракона (так как Техника синтаксического анализа полностью фокусируется на синтаксическом анализе, в то время как Книга Дракона рассматривает синтаксический анализ только как одну, хотя и важную, часть процесса построения компилятора).,
Пройдя (довольно) несколько классов компиляторов, я использовал и The Dragon Book, и C&T. Я думаю, что C&T гораздо лучше справляется с конструкцией компилятора. Не хочу ничего отнимать от The Dragon Book, но я думаю, что C&T - гораздо более практичная книга.
Кроме того, если вы любите писать на Java, я рекомендую использовать JFlex и BYACC/J для ваших нужд лексизации и синтаксического анализа.
flex и bison - это новые lex и yacc. Синтаксис для BNF часто выводится за то, что он немного тупой. По этой причине некоторые переехали в ANTLR и Ragel.
Если вы не слишком много переводите, вы можете сделать одноразовое использование многострочных регулярных выражений с Perl или Ruby. Написание совместимой грамматики BNF для существующего языка - задача не из легких.
С другой стороны, вполне возможно использовать файлы.l и.y любого данного языка, если они доступны как открытый исходный код. Затем вы можете создать новый код из существующего дерева разбора.
Еще один учебник, который стоит рассмотреть, - Прагматика языка программирования. Я предпочитаю это книге Дракона, но YMMV.
Если вы используете Perl, еще один инструмент для рассмотрения - Parse:: RecDescent.
Если вам просто нужно выполнить этот перевод один раз и ничего не знать о технологии компиляции, я бы посоветовал вам сделать как можно больше с некоторыми довольно упрощенными переводами, а затем исправить это вручную. Да, это много работы. Но это меньше работы, чем изучение сложного предмета и поиск правильного решения для одной работы. Тем не менее, вы все равно должны изучить предмет, но не позволяйте, не зная, что это препятствие для завершения вашего текущего проекта.
Если вы предпочитаете инструменты на основе Java, компилятор Java, JavaCC, является хорошим анализатором / сканером. Он управляется конфигурационным файлом и генерирует Java-код, который вы можете включить в свою программу. Я не использовал его пару лет, поэтому я не уверен, какова текущая версия. Вы можете узнать больше здесь: https://javacc.dev.java.net/