Получение дополнительной информации о парсинге

Почему никто не упомянул Number.isInteger()?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger

Прекрасно работает для меня и решает проблему с NaN, начинающимся с числа.

9
задан James Thompson 27 June 2009 в 20:30
поделиться

8 ответов

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

По 2 и 3 я не могу предложить ничего, кроме того, что вы уже нашли ( Я в основном использую Python и pyparsing и могу прокомментировать опыт работы со многими фреймворками синтаксического анализа, ориентированными на Python, но для C ++ я в основном использую старый добрый yacc или bison в любом случае , и моя старая корявая копия Книги Дракона - не последнее издание, на самом деле - это все, что я держу при себе для этой цели ...).

4
ответ дан 4 December 2019 в 13:04
поделиться

В Perl модули Parse :: RecDescent - это первое, с чего нужно начать. Добавьте руководство к имени модуля, и Google сможет найти множество руководств, которые помогут вам начать работу.

1
ответ дан 4 December 2019 в 13:04
поделиться

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

Самый известный пример - это, вероятно, Parsec , у которого есть хороший пользователь руководство , в котором объясняется, как его использовать. Есть список портов этой библиотеки на другие языки (включая C ++ и Ruby ), перечисленных на странице Parsec вики Haskell , хотя я не знаком с ними, поэтому я не могу сказать, насколько они близки к использованию Parsec в Haskell.

Если вы хотите узнать, как они работают внутри компании и как писать свои собственные, я рекомендую начать с Главы 8 («Функциональные синтаксические анализаторы»). ") из книги Грэма Хаттона Программирование на Haskell . Как только вы хорошо поймете эту главу (что, вероятно, займет несколько чтений), вы будете настроены.

Я не могу сказать, насколько они близки к использованию Parsec в Haskell.

Если вы хотите узнать, как они работают внутри компании и как писать свои собственные, я рекомендую начать с главы 8 («Функциональные синтаксические анализаторы») из книги Грэма Хаттона Programming в Haskell . Как только вы хорошо поймете эту главу (что, вероятно, займет несколько чтений), вы будете настроены.

Я не могу сказать, насколько они близки к использованию Parsec в Haskell.

Если вы хотите узнать, как они работают внутри компании и как писать свои собственные, я рекомендую начать с главы 8 («Функциональные синтаксические анализаторы») из книги Грэма Хаттона Programming в Haskell . Как только вы хорошо поймете эту главу (что, вероятно, займет несколько чтений), вы будете настроены.

2
ответ дан 4 December 2019 в 13:04
поделиться

Забавное время: я провел много этого утра, размышляя о машинах состояний и синтаксических анализаторах и пытаясь выяснить, как я могу узнать о них больше.

Для 2 вы можете взглянуть at Ragel (подходит для C ++ и Ruby).

1
ответ дан 4 December 2019 в 13:04
поделиться

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

2
ответ дан 4 December 2019 в 13:04
поделиться

Вот мой ответ на ваши (очень хорошие) вопросы:

  1. Я думаю, что синтаксический анализатор больше всего выигрывает в нетривиальных ситуациях, когда грамматика действительно существует. Вы должны знать, как работают синтаксические анализаторы и грамматики, чтобы думать об этой технике, а не каждый разработчик.
  2. lex / yacc - это старые инструменты Unix, которые могут быть полезны для вас как разработчика C ++. Может быть, и Bison.
  3. ANTRL и сопутствующая книга очень хороши. «Написание компиляторов и интерпретаторов» содержит примеры C ++, которые могут вам понравиться.

Шаблон интерпретатора GoF - еще одна техника для написания «маленьких языков». Взгляните на это.

4
ответ дан 4 December 2019 в 13:04
поделиться

Определение грамматики с использованием BNF, EBNF или чего-то подобного проще, и позже вам будет удобнее поддерживать их. Также вы можете найти множество примеров определений грамматики. И последнее, но не менее важное: если вы собираетесь поговорить о своей грамматике с кем-то еще в поле, лучше, если вы оба говорите на одном языке (BNF, EBNF и т. Д.).

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

Для C ++ я бы также предложил lex / yacc. Для Ruby это выглядит достойным выбором: Coco / R (uby)

1
ответ дан 4 December 2019 в 13:04
поделиться

Вот руководство по автономному (10 страниц!), Полностью переносимому компилятору-компилятору который может быть использован для очень быстрого проектирования и реализации DSL с "низкими накладными расходами":

http://www.bayfronttechnologies.com/mc_tutorial.html

Этот сайт проведет вас через статью Вэла Шорре 1964 года по MetaII. Да, 1964 год. И это потрясающе. Так я узнал о компиляторах еще в 1970 году.

1
ответ дан 4 December 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: