Парсинг, где я могу об этом узнать

Мне дали задание «перевести» один язык на другой. Источник слишком гибкий (сложный) для простого построчного подхода с регулярным выражением. Где я могу узнать больше о лексическом анализе и парсерах?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
0
4 438
12

Ответы 12

Недавно я работал с PLY, который представляет собой реализацию lex и yacc в Python. Начать с ним довольно легко, и в документации есть несколько простых примеров.

Синтаксический анализ может быстро превратиться в очень техническую тему, и вы обнаружите, что вам, вероятно, не нужно знать все детали алгоритма синтаксического анализа, если вы используете конструктор парсеров, такой как PLY.

Попробуйте ANLTR:

ANTLR, ANother Tool for Language Recognition, is a language tool that provides a framework for constructing recognizers, interpreters, compilers, and translators from grammatical descriptions containing actions in a variety of target languages.

Для этого также есть книга.

alt text

Если вы предпочитаете инструменты на основе Java, компилятор Java Compiler Compiler, JavaCC, будет хорошим парсером / сканером. Он управляется файлом конфигурации и генерирует java-код, который вы можете включить в свою программу. Я не использовал его пару лет, поэтому не уверен, какая у меня текущая версия. Вы можете узнать больше здесь: https://javacc.dev.java.net/

Если вы хотите "эмоционально" рассказать о предмете, возьмите копию "Книга Дракона". Это обычно текст в курсе проектирования компилятора. Это определенно удовлетворит вашу потребность «узнать больше о лексическом анализе и парсерах», а также множество других вещей, связанных с весело!

IMH (umble) О, сэкономьте себе руку и / или ногу и купите более старую версию - она ​​удовлетворит ваши информационные желания.

Мэтт, существует 3 издания, поэтому, пожалуйста, добавьте ISBN для того, которое вы предлагаете, или улучшите свои комментарии с помощью ISBN всех книг и скажите пару слов о каждой.

Ostati 17.12.2018 19:26

правда @Ostati? Я четко заявляю, чтобы сэкономить деньги и купить более старую версию ... или не экономить деньги, а купить текущую.

Matt Cummings 11.01.2019 18:44

Мэтт, мне потребовалось время, чтобы выяснить, какая версия была какой. Но был ваш ответ, за который я, кстати, проголосовал, ISBN ... в любом случае, я взял книгу и начал свое путешествие. Спасибо.

Ostati 11.01.2019 22:48

flex и bison - это новые lex и yacc. Синтаксис BNF часто высмеивают за то, что он немного тупой. Некоторые перешли на ANTLR и Ragel по этой причине.

Если вы не делаете много переводов, вы можете выполнить одноразовый перевод, используя многострочные регулярные выражения с Perl или Ruby. Написание совместимой грамматики BNF для существующего языка - непростая задача.

С другой стороны, вполне возможно использовать файлы .l и .y любого заданного языка, если они доступны в виде открытого исходного кода. Затем вы можете построить новый код из существующего дерева синтаксического анализа.

Lexing / Parsing + typecheck + code generation - отличное упражнение в CS, я бы порекомендовал его всем, кому нужна прочная основа, поэтому я полностью за Dragon Book

Книга Никлауса Вирта "Конструкция компилятора" (доступна в виде бесплатного PDF-файла) http://www.google.com/search?q=wirth+compiler+construction

Еще один учебник, который стоит рассмотреть, - это Прагматика языка программирования. Я предпочитаю это книге Дракона, но YMMV.

Если вы используете Perl, следует рассмотреть еще один инструмент - Parse :: RecDescent.

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

Я нашел этот сайт полезным:

Праймеры Lex и YACC / HOWTO

В первый раз я использовал lex / yacc для относительно простого проекта. Этот урок был всем, что мне действительно нужно. Когда позже я подошел к более сложным проектам, знакомство с этим учебником и простым проектом позволило мне создать что-то более интересное.

Взяв (довольно) несколько классов компилятора, я использовал как Книга Дракона, так и C&T. Я думаю, что C&T гораздо лучше справляется с задачей сделать конструкцию компилятора удобоваримой. Не отрываясь от «Книги драконов», я думаю, что C&T - гораздо более практичная книга.

Кроме того, если вам нравится писать на Java, я рекомендую использовать JFlex и BYACC / J для ваших нужд лексирования и синтаксического анализа.

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

(а) Думали ли вы о том, чтобы пойти в школу с приличной учебной программой по CS?
(б) Есть много онлайн-лекций, таких как Открытые курсы MIT. В их Раздел EE / CS есть много курсов, которые касаются синтаксического анализа, хотя я не вижу ничего о синтаксическом анализе как таковом. Обычно он вводится как один из первых теоретических курсов, поскольку классификация языков и автоматы лежат в основе большей части теории CS.

+1 для mit's ocw, я все время использую его для математики. По какой-то причине пойти на занятия по МОЕМУ расписанию намного лучше, чем вставать в 6:30.

Shawn 21.04.2011 07:24

Методы синтаксического анализа - Практическое руководство Авторы Дик Грюн и Кериэль Дж. Джейкобс

Эта книга (в свободном доступе в формате PDF) дает обширный обзор различных методов / алгоритмов синтаксического анализа. Если вы действительно хотите понять различные алгоритмы синтаксического анализа, этот IMO является лучшим справочником, чем Dragon Book (поскольку методы синтаксического анализа полностью сосредоточены на синтаксическом анализе, в то время как Dragon Book охватывает синтаксический анализ только как одну, хотя и важную, часть процесса создания компилятора) .

Я исправил ссылку: актуальный PDF (для первой редакции) можно скачать здесь: dickgrune.com/Books/PTAPG_1st_Edition/BookBody.pdf; новое издание и более обширное издание книги теперь также доступно на Amazon.

Gio 01.12.2012 15:31

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