Лексер написан на Javascript? - PullRequest
       73

Лексер написан на Javascript?

28 голосов
/ 01 декабря 2009

У меня есть проект, в котором пользователю нужно определить набор инструкций для пользовательского интерфейса, который полностью написан на javascript. Мне нужно иметь возможность разобрать строку инструкций и затем перевести их в инструкции. Есть ли какие-нибудь библиотеки для анализа, которые на 100% состоят из JavaScript? Или генератор, который будет генерировать в JavaScript? Спасибо!

Ответы [ 10 ]

23 голосов
/ 01 декабря 2009

Что-то вроде http://jscc.phorward -software.com / , может быть?

JS / CC является первой доступной системой разработки синтаксических анализаторов для JavaScript и ECMAScript . Он был разработан как с целью создания продуктивной системы разработки компиляторов, так и с целью создания простой в использовании академической среды для людей, заинтересованных в том, как генерация таблиц анализа выполняется в целом. анализ "снизу вверх".

Независимое от платформы программное обеспечение объединяет оба: Лексический анализатор на основе регулярных выражений Генератор , сопоставляющий отдельные токены из входного потока символов и a LALR (1 ) генератор синтаксических анализаторов , вычисляющий таблицы синтаксического анализа для заданной контекстно-свободной грамматики спецификации и построение автономного работающего синтаксического анализатора. Не зависящая от контекста грамматика, подаваемая в JS / CC, определена в метаязыке на основе Backus-Naur-Form и позволяет оценивать вставку отдельного семантического кода при сокращении правила.

Сам JS / CC полностью написан на ECMAScript , поэтому его можно выполнять разными способами: как независимый от платформы JavaScript-код на основе браузера, встроенный в веб-сайт, как хост-приложение сценариев Windows, как скомпилированный исполняемый файл JScript.NET, как интерпретируемое приложение Mozilla / Rhino или Mozilla / Spidermonkey или сценарий оболочки V8 для Windows, * nix, Linux и Mac OSX. Однако для продуктивного выполнения рекомендуется использовать версии командной строки. Эти версии способны собирать полный компилятор из спецификации синтаксического анализатора JS / CC, которая затем сохраняется в исходном файле JavaScript .js.

13 голосов
/ 01 декабря 2009

Если вы хотите создавать парсеры JavaScript и генераторы кода, проверить реализацию MetaII в Javascript.

Учебник по MetaII Compiler проведет вас через создание полностью автономной системы компилятора, которая может переводить себя и другие языки:

Учебник по MetaII-компилятору

Все это основано на удивительной небольшой 10-страничной технической статье Вала Шорре: META II: синтаксически-ориентированный язык написания компиляторов от честного бога 1964 года. Полное самоописание компилятора MetaII составляет около 30 строк! Я научился создавать компиляторы из этого еще в 1970 году. Есть удивительный момент, когда вы, наконец, понимаете, как компилятор может сам себя восстанавливать ....

Учебное пособие объясняет, как работает MetaII, и реализует MetaII, компилируя MetaII в JavaScript. Вы можете легко изменить этот компилятор для анализа других языков и создания другого Javascript.

Я знаю автора веб-сайта с тех времен, когда я учился в колледже, но не имею никакого отношения к сайту.

6 голосов
/ 28 апреля 2013

Jison - это, пожалуй, лучший и наиболее активный генератор лексеров и парсеров для Javascript.Он имитирует Bison и Yacc.

Jison: http://zaach.github.io/jison/

Если вам нужен легкий лексер (~ 100 слок), вы можете взглянуть на Lexed.js: https://github.com/tantaman/lexed.js

4 голосов
/ 01 декабря 2009

Для простых задач синтаксического анализа мне очень нравится использовать вариант синтаксического анализатора приоритета оператора Pratt . В то время как Пратт писал оригинальную статью, используя старый диалект Лиспа, те же самые концепции можно легко использовать практически на любом языке. На самом деле Дуглас Крокфорд написал отличную статью о разборе приоритетов операторов сверху вниз в JavaScript , что может быть именно тем, что вам нужно.

2 голосов
/ 14 июля 2016

Вот пример парсера для «псевдо» естественного языка инструкций, который был реализован в pure JavaScript с Chevrotain Разбор DSL :

https://github.com/SAP/chevrotain/blob/master/examples/parser/inheritance/inheritance.js

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

Chevrotain подпадает под категорию "библиотек для анализа на 100% JavaScript" , поскольку он выполняет без генерации кода . Использование Chevrotain похоже на «ручное создание» рекурсивного приличного парсера, только без большей части головной боли , такой как:

  • Создание функции Lookahead (решение, какую альтернативу использовать)
  • Автоматическое восстановление после ошибок.
  • Обнаружение левой рекурсии
  • Обнаружение неоднозначности.
  • Информация о местоположении.
  • ...

как Chevrotain обрабатывает это автоматически.

1 голос
/ 17 февраля 2015

Antlr версия 4.5 теперь имеет цель Javascript .

1 голос
/ 23 января 2013

Если вам нужен лексер и ничего, кроме лексера, взгляните на это: https://github.com/aaditmshah/lexer

Это чистый лексер JavaScript с множеством мощных функций, написанных всего за несколько строк кода.

1 голос
/ 17 мая 2010

, если вы действительно ищете лексера, попробуйте prettify .

1 голос
/ 01 декабря 2009

В зависимости от конструкции «набора инструкций» вы можете использовать встроенную в Javascript функцию eval, которая анализирует источник Javascript; Вы можете написать простой переводчик для преобразования инструкций в код Javascript.

Кстати, будьте очень осторожны с отверстиями XSS.

0 голосов
/ 01 декабря 2009

Я искал нечто подобное, в котором не было бы дыр в безопасности, и я наткнулся на два ресурса. Они не анализируют скрипт, но фактически запускают его в «безопасной» среде - что-то, что вы не можете гарантировать при использовании функции eval. Итак, я не знаю, если это именно то, что вы ищете, но посмотрите:

  1. jsandbox - Песочница Javascript
  2. Google Caja - виртуальный фрейм.
...