LINUX.ORG.RU

Какой тип парсеров лучше использовать для разбора Javascript?

 , , ,


0

1

LR (LALR)? LL? Recursive descent? Что-то другое? Нужно, чтобы парсер получился как можно проще.

Я правильно понимаю: нельзя так просто взять и написать грамматику для yacc/bison из-за правила о вставке точки с запятой?

Готовые парсеры называются esprima и acorn. Тебе точно надо свой колбасить через генераторы? Если надо, то бизоноподобные я бы использовал только если пакратовскими описать нельзя. Вот для PEG https://github.com/pegjs/pegjs/blob/master/examples/javascript.pegjs, но если чо, мопед не мой.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

Готовые парсеры называются esprima и acorn.

Есть и другие, но они (почти?) все написаны на JS.

А мне скорости nodejs не хватает, хочу сделать на другом недоязычке.

kinkstarter ()

из-за правила о вставке точки с запятой?

Это Вы о чем? Переносы строк можно заменить на точки с запятой или наоборот, они равноценны, кроме некоторых случаев, которые описаны в документации, таких как например

foo()
(bar)

onceagain2017 ()
Ответ на: комментарий от onceagain2017

Я про автоматическую вставку точки с запятой в конце строки, которую выполняют парсеры, если без точки с запятой код не распарсивается.

кроме некоторых случаев

Вот именно.

foo()
(bar)

А также

foo
.f()
.g()

И так далее. Тупо заменять нельзя.

kinkstarter ()
Ответ на: комментарий от kinkstarter

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

Vit ★★★★★ ()
Ответ на: комментарий от Vit

У Фейсбука есть тайпчекер (ну и как следствие, парсер) на OCaml, Flow называется.

anonymous ()
Ответ на: комментарий от kinkstarter

Кстати, а можешь посоветовать хороший туториал, как описывать парсеры на bison/yacc и при этом не отстрелить себе ноги по шею? Я так и не смог объять разумом методику. В итоге скатился на peg, где все сверху вниз раскладывается одним единственным способом.

Vit ★★★★★ ()
Ответ на: комментарий от kinkstarter

Формальное описание грамматики (BNF) есть прямо в стандарте:

https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Appendix A: Grammar Summary

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

Хотя, может быть для этого есть какой-то простой трюк

Deleted ()
Ответ на: комментарий от Deleted

А зачем «описывать грамматику», если можно просто написать парсер?

onceagain2017 ()
Ответ на: комментарий от onceagain2017

А зачем «описывать грамматику»

В стандарте? Да кто ж их знает. Но это хорошая, годная практика. Там же именно описание, почти в свободной форме.

если можно просто написать парсер?

Ну, скорее всего не так уж просто. Тем более с yacc/bison. Может быть получится обрабатывать автоматическую вставку точки с запятой с помощью восстановления после ошибок https://www.gnu.org/software/bison/manual/html_node/Error-Recovery.html

А может быть и нет

Deleted ()

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

kinkstarter ()
Ответ на: комментарий от kinkstarter

Наверное имелось в виду из v8, а не из ноды.

А точно acorn медленный? Он довольно грамотно оптимизирован. Есть какие-то критерии какая скорость нужна?

Vit ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.