Jaki jest najlepszy język do pisania parserów?

1

Cześć.
Kiedyś często słyszałem stwierdzenie, że język programowania powinien być dostosowany do rowiązywanego problemu.
Wtey zawsze się z tym nie zgadzałem, bo większość problemów, które rozwiązuje to CRUDy lub źle sformułowany warunek w ifie.

Dziś jednak przychodzę do was z niestandardowym problemem, bo chciałbym napisać parser własnego, prostego języka programowania i dlatego pytam się was Jaki jest najlepszy język do pisania parserów. Możliwe, że w przyszłości chciałbym dopisać także interpreter i/lub kompilator.

Żeby nie było, że nic sam nie zrobiłem jest to moja trzecia próba:

  • Za pierszym razem, 10 lat temu, wziąłem klasycznie C, Flex (Lex) i Bison (Yacc). Nauczyło mnie to, że C jest niesamowicie rozwlekły i potrzebuje bardziej ekspresyjnego języka programowania. Dodatkowo pisanie gramatyki LALR w dodatkowych plikach, które później są kompilowane do C, dla gramatyki języka prostszego od C jest uciążliwe.
  • Za drugiem razem, 5 lat temu, wziąłem Perla. Zachwycił mnie swoją zwięzłością, tym że niepotrzebowałem Lexa tylko wystarczyła jedna funkcja, oraz tym że Yacc był dostarczany jako biblioteka, więc nie potrzebowałem żadnych zewnętrznych doinstalowywać. Niestety Perl jest językiem dynamicznie typowanym a ja nie ogarniam programowania nie wiem jakiego typu jest zmienna.
  • Obecnie stwierdzam, że dalej nie rozumiem zmiennego stanu, więc dobrzy by ten język preferował niezmienność nad zmiennością.

TL;DR
Poszukuj ekspresywnego, statycznie typowanego, języka programowania ułatwiającego pisanie z niezmiennych stanem, do którego jest napisana dobra biblioteka do pisania parserów.

Na razie mam trzy typy:

  • OCaml - ma dodatki YaccOCaml i LexOCaml, więc znów oznacza to pisanie gramatyki LALR w dziwnym języku domenowym
  • Haskell. Najpopularniejsza jest biblioteka MegaParsec w której jest napisany np. parser języka Idris
  • Rust. Najpopularniejsza jest biblioteka nom w której jest napisany np. parser języka Elm

Która najlepsza?
Jakieś inne propozycje?

2

Ja polecam https://github.com/lihaoyi/fastparse . W przykładach jest parser do CSSa, Pythona, Scali, JSONa i pewnie coś jeszcze by się znalazło.

0

Jeśli nie musi być typowane to Elixir/Erlang też mają całkiem spoko narzędzia:

2

Czemu nie Java albo C++ z antlr

1

A może by tak Golang wraz z https://github.com/alecthomas/participle

0

@Kamil Żabiński: Trochę późno, ale -- skoro kiedyś mocowałeś się z flexem/bisonem pod C, to może Ci przypadnie do gustu PLY lub SLY (Python) -- ja w tym parę drobiazgów napisałem i jestem zadowolony:
https://www.dabeaz.com/software.html

1

Zobacz sobie ANTLR. Ze względu na osobę twórcy i zleceniodawców dla których konsultował.

Bardziej wskazuję na osobę niż na samo narzędzie.
Terence Parr i co on ma do powiedzenia, to może być interesujące.

1

Mam w sumie podobnie, tylko że póki co zawsze wracałem do Bison/Flex. Jak znajdę trochę czasu, to przysiądę bardziej do Ocamla, bo trochę w nim pisałem i wydaje mi się, że ze względu na wbudowane pattern recognition idealnie pasuje do pisania parserów. Czasem możesz też zrobić recursive descent parser, żaden wstyd :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1