Lug и Бейсик
2025-03-27 09:32Для C++ появилась и развивается реализация универсального парсера. Это вместо YACC, Bison и прочих PEGTL.
Проект: github.com/jwtowner/lug
Пример реализации Бейсика на Си++. Меньше пятисот строк кода: github.com/jwtowner/lug/blob/master/samples/basic/basic.cpp
Простой калькулятор:
Проект: 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);
no subject
Date: 2025-03-27 18:30 (UTC)no subject
Date: 2025-03-27 20:34 (UTC)no subject
Date: 2025-03-27 22:55 (UTC)no subject
Date: 2025-03-27 21:47 (UTC)no subject
Date: 2025-03-27 21:55 (UTC)no subject
Date: 2025-03-28 10:14 (UTC)no subject
Date: 2025-03-28 11:23 (UTC)И макросовъ не нать.
no subject
Date: 2025-03-28 09:11 (UTC)no subject
Date: 2025-03-28 09:19 (UTC)