2025-03-27

vak: (Знайка)
Для C++ появилась и развивается реализация универсального парсера. Это вместо YACC, Bison и прочих PEGTL.

Проект: github.com/jwtowner/lug

Пример реализации Бейсика на Си++. Меньше пятисот строк кода: github.com/jwtowner/lug/blob/master/samples/basic/basic.cpp

Простой калькулятор:
using namespace lug::language;

int i;
double e, l, n, r, s;
double v[26];

extern rule Expr;

implicit_space_rule BLANK = lexeme[ *"[ \t]"_rx ];

rule EOL    = lexeme[ "[\n\r;]"_rx ];
rule ID     = lexeme[ "[a-zA-Z]"_rx  <[](syntax m) -> int { return static_cast<int>(lug::unicode::tolower(static_cast<char32_t>(m.str().at(0))) - U'a'); } ];
rule NUMBER = lexeme[ ( ~"[-+]"_rx > +"[0-9]"_rx > ~('.' > +"[0-9]"_rx) )
                                     <[](syntax m) -> double { return std::stod(std::string{m}); } ];
rule Value  = n%NUMBER               <[]{ return n; }
            | i%ID > !"="_sx         <[]{ return v[i]; }
            | '(' > e%Expr > ')'     <[]{ return e; };
rule Prod   = l%Value > *(
                  '*' > r%Value      <[]{ l *= r; }
                | '/' > r%Value      <[]{ l /= r; }
            )                        <[]{ return l; };
rule Sum    = l%Prod > *(
                  '+' > r%Prod       <[]{ l += r; }
                | '-' > r%Prod       <[]{ l -= r; }
            )                        <[]{ return l; };
rule Expr   = i%ID > '=' > s%Sum     <[]{ return v[i] = s; }
            | s%Sum                  <[]{ return s; };
rule Stmt   = ( (   "exit"_isx
                  | "quit"_isx )     <[]{ std::exit(EXIT_SUCCESS); }
                | e%Expr             <[]{ std::cout << e << "\n"; }
            ) > EOL
            | *( !EOL > any ) > EOL  <[]{ std::cout << "SYNTAX ERROR\n"; };

grammar Grammar = start(Stmt > eoi);
vak: (Путиномедвед)
"Можно было бы под эгидой ООН, США, с европейскими странами, разумеется, с нашими партнерами и друзьями обсудить возможность введения в России временного управления. Для того, чтобы провести демократические выборы, чтобы привести к власти дееспособное и пользующееся доверием народа правительство и потом уже с ними начинать переговоры о мирном договоре."

Я заменил одно слово. Угадайте какое.