Почему никто не упомянул Number.isInteger()
?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Прекрасно работает для меня и решает проблему с NaN
, начинающимся с числа.
На 1., я бы сказал, что главным преимуществом является ремонтопригодность - внесение небольших изменений в язык означает лишь внесение соответствующих небольших изменений в грамматику, а не тщательное изучение различных мест в коде, который может иметь какое-то отношение к тому, что вы хотите изменить ... на порядок выше производительность и меньший риск ошибок.
По 2 и 3 я не могу предложить ничего, кроме того, что вы уже нашли ( Я в основном использую Python и pyparsing
и могу прокомментировать опыт работы со многими фреймворками синтаксического анализа, ориентированными на Python, но для C ++ я в основном использую старый добрый yacc
или bison
в любом случае , и моя старая корявая копия Книги Дракона - не последнее издание, на самом деле - это все, что я держу при себе для этой цели ...).
В Perl модули Parse :: RecDescent - это первое, с чего нужно начать. Добавьте руководство к имени модуля, и Google сможет найти множество руководств, которые помогут вам начать работу.
Я бы серьезный взгляд на монадический синтаксический анализ на основе комбинаторов (который часто также имеет дело с лексическим анализом) в Haskell. Мне это показалось настоящим открытием; Удивительно, насколько легко с помощью этого метода можно создать парсер с нуля. На самом деле это настолько просто, что часто бывает быстрее написать собственный синтаксический анализатор, чем пытаться использовать существующие библиотеки.
Самый известный пример - это, вероятно, Parsec , у которого есть хороший пользователь руководство , в котором объясняется, как его использовать. Есть список портов этой библиотеки на другие языки (включая C ++ и Ruby ), перечисленных на странице Parsec вики Haskell , хотя я не знаком с ними, поэтому я не могу сказать, насколько они близки к использованию Parsec в Haskell.
Если вы хотите узнать, как они работают внутри компании и как писать свои собственные, я рекомендую начать с Главы 8 («Функциональные синтаксические анализаторы»). ") из книги Грэма Хаттона Программирование на Haskell . Как только вы хорошо поймете эту главу (что, вероятно, займет несколько чтений), вы будете настроены.
Я не могу сказать, насколько они близки к использованию Parsec в Haskell.Если вы хотите узнать, как они работают внутри компании и как писать свои собственные, я рекомендую начать с главы 8 («Функциональные синтаксические анализаторы») из книги Грэма Хаттона Programming в Haskell . Как только вы хорошо поймете эту главу (что, вероятно, займет несколько чтений), вы будете настроены.
Я не могу сказать, насколько они близки к использованию Parsec в Haskell.Если вы хотите узнать, как они работают внутри компании и как писать свои собственные, я рекомендую начать с главы 8 («Функциональные синтаксические анализаторы») из книги Грэма Хаттона Programming в Haskell . Как только вы хорошо поймете эту главу (что, вероятно, займет несколько чтений), вы будете настроены.
Забавное время: я провел много этого утра, размышляя о машинах состояний и синтаксических анализаторах и пытаясь выяснить, как я могу узнать о них больше.
Для 2 вы можете взглянуть at Ragel (подходит для C ++ и Ruby).
Давайте создадим компилятор - это пошаговое руководство по написанию простого компилятора. Код написан на Delphi (Pascal), но он достаточно прост, чтобы его можно было легко перевести на большинство других языков.
Вот мой ответ на ваши (очень хорошие) вопросы:
Шаблон интерпретатора GoF - еще одна техника для написания «маленьких языков». Взгляните на это.
Определение грамматики с использованием BNF, EBNF или чего-то подобного проще, и позже вам будет удобнее поддерживать их. Также вы можете найти множество примеров определений грамматики. И последнее, но не менее важное: если вы собираетесь поговорить о своей грамматике с кем-то еще в поле, лучше, если вы оба говорите на одном языке (BNF, EBNF и т. Д.).
Написание собственного кода синтаксического анализа похоже на изобретает велосипед и подвержен ошибкам. Это также менее ремонтопригодно. Конечно, он может быть более гибким и может быть хорошим выбором для небольших проектов. но использование существующего генератора синтаксического анализатора, который берет грамматику и выводит код, должно покрыть большинство наших потребностей.
Для C ++ я бы также предложил lex / yacc. Для Ruby это выглядит достойным выбором: Coco / R (uby)
Вот руководство по автономному (10 страниц!), Полностью переносимому компилятору-компилятору который может быть использован для очень быстрого проектирования и реализации DSL с "низкими накладными расходами":
http://www.bayfronttechnologies.com/mc_tutorial.html
Этот сайт проведет вас через статью Вэла Шорре 1964 года по MetaII. Да, 1964 год. И это потрясающе. Так я узнал о компиляторах еще в 1970 году.