Dasturlash

Yantra: C++ uchun yangi LALR(1) parser generatori

1-oktabr, 2026, 09:380 ko'rish3 daqiqa o'qish
Yantra: C++ uchun yangi LALR(1) parser generatori

Yantra — bu C++ uchun yangi LALR(1) parser generatori boʻlib, lexer, parser va AST walkerlarni bir xil vosita orqali yaratadi. Bu vosita butun sintaksis daraxtini (AST) dastlab yaratadi, keyin uni topdan pastga qarab o'tadi. Bu yondashuv boshqa parser generatorlariga nisbatan bir nechta afzalliklarga ega.

Yantra qanday ishlaydi

Yantra butun sintaksis daraxtini (AST) dastlab yaratadi, keyin uni topdan pastga qarab o'tadi. Bu yondashuv boshqa parser generatorlaridan farqli oʻlaroq, semantik harakatlarni dastlabki parsdan keyin bajaradi. Bu esa grammatikalarni qoʻl bilan yaratilgan AST sinflari va ajratilgan o'tish bosqichlariga muhtoj boʻlmasligini anglatadi.

License: MIT Version

Yantra bir nechta walkerlarni bir xil grammatikadan yaratish imkonini beradi. Masalan, bir walker C++ kodini chiqarishi mumkin, ikkinchisi esa Java kodini chiqarishi mumkin. AST va walker sinflari avtomatik ravishda yaratiladi.

C++

Yantra ning asosiy xususiyatlari

  • Butun sintaksis daraxtini (AST) dastlab yaratadi, keyin uni topdan pastga qarab o'tadi.
  • Semantik harakatlarni parsdan keyin bajaradi, bu esa grammatikalarni qoʻl bilan yaratilgan AST sinflari va ajratilgan o'tish bosqichlariga muhtoj boʻlmasligini anglatadi.
  • Bir nechta walkerlarni bir xil grammatikadan yaratish imkonini beradi.
  • Integratsiyalashgan lexer bilan modullarni qoʻllab-quvvatlaydi (masalan, ichma-ich o'tirgan izohlar).
  • Amalgamated single-file output modi mavjud, bu esa generatsiyalashgan main() funksiyasini oʻz ichiga oladi.
  • C++23 standartiga mos keladi.
  • MIT litsenziyasi ostida tarqatiladi.

Yantra ning misoli

Yantra ning oddiy misoli quyidagicha:

Yantra Logo
start := expr;

  expr := expr(a) PLUS expr(b)
  %{
      std::cout << "Adding" << std::endl;
  %}

  expr := NUMBER(N)
  %{
      std::cout << "Number: " << N.text << std::endl;
  %}

  NUMBER := "\\d+";
  PLUS := "\\+";
  WS := "\\s+"!;

Bu misolni "1 + 2 + 3" matniga qoʻllash natijasida quyidagilar chiqadi:

git clone git@github.com:TantrixAuto/yantra.git
cd yantra
mkdir build && cd build
cmake ..
cmake --build .
Adding
  Number: 1
  Adding
  Number: 2
  Number: 3

Bu natijada, tashqi "Adding", daraxtning ildizi, dastlabki chiqadi, undan keyin uning farzandlari chiqadi. Bu faqat butun daraxt mavjud boʻlganda mumkin.

start := stmts;
stmts := stmts stmt;
stmts := stmt;
stmt := ID;

ID := "[A-Za-z]+";
WS := "\s"!;

Yantra ning cheklovlari

Yantra hali ham yosh (0.5.1, pre-1.0) va bir nechta cheklovlarga ega. Ushbu cheklovlar shu manzilda ro'yxatga olingan.

bin/ycc -c ascii -f hello.y -a

Yantra ning manba kodlari GitHub da mavjud. Feedback va savollarni xush kelibsiz.

# clang
clang++ --std=c++23 -o hello hello.cpp

# gcc
g++ --std=c++23 -o hello hello.cpp

# MSVC (cl.exe, from a Developer Command Prompt)
cl /std:c++23 /EHsc /nologo hello.cpp

Asl manba: github.com

Manba: Hacker News
#Yantra #C++ #parser generator #LALR(1) #sintaksis daraxti
Telegram da muhokama qilish