From 25854d0b9914defbd6af2782288995d7fddaf499 Mon Sep 17 00:00:00 2001 From: mzhoot Date: Sun, 31 May 2026 18:41:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D1=82=D1=87=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20=D1=81?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B0=D0=BA=D1=81=D0=B8=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zend/zend_constants.c | 45 ++++++--- Zend/zend_constants.h | 6 +- Zend/zend_language_scanner.l | 173 +++++++++++++++++++++++++++-------- 3 files changed, 170 insertions(+), 54 deletions(-) diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index 18292203..08a056a6 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -221,31 +221,48 @@ static zend_constant *zend_get_halt_offset_constant(const char *name, size_t nam ZEND_API zend_constant *_zend_get_special_const(const char *name, size_t len) /* {{{ */ { + + // Оригинальные проверки if (len == 4) { if ((name[0] == 'n' || name[0] == 'N') && - (name[1] == 'u' || name[1] == 'U') && - (name[2] == 'l' || name[2] == 'L') && - (name[3] == 'l' || name[3] == 'L') - ) { + (name[1] == 'u' || name[1] == 'U') && + (name[2] == 'l' || name[2] == 'L') && + (name[3] == 'l' || name[3] == 'L')) { return null_const; } if ((name[0] == 't' || name[0] == 'T') && - (name[1] == 'r' || name[1] == 'R') && - (name[2] == 'u' || name[2] == 'U') && - (name[3] == 'e' || name[3] == 'E') - ) { + (name[1] == 'r' || name[1] == 'R') && + (name[2] == 'u' || name[2] == 'U') && + (name[3] == 'e' || name[3] == 'E')) { return true_const; } - } else { + } else if (len == 5) { if ((name[0] == 'f' || name[0] == 'F') && - (name[1] == 'a' || name[1] == 'A') && - (name[2] == 'l' || name[2] == 'L') && - (name[3] == 's' || name[3] == 'S') && - (name[4] == 'e' || name[4] == 'E') - ) { + (name[1] == 'a' || name[1] == 'A') && + (name[2] == 'l' || name[2] == 'L') && + (name[3] == 's' || name[3] == 'S') && + (name[4] == 'e' || name[4] == 'E')) { return false_const; } } + + // Русские аналоги + if (len == 8) { + if (memcmp(name, "ложь", 8) == 0) { + return false_const; + } + } + if (len == 10) { + if (memcmp(name, "пусто", 10) == 0) { + return null_const; + } + } + if (len == 12) { + if (memcmp(name, "правда", 12) == 0) { + return true_const; + } + } + return NULL; } /* }}} */ diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h index 9461ac76..f98ef338 100644 --- a/Zend/zend_constants.h +++ b/Zend/zend_constants.h @@ -106,7 +106,11 @@ ZEND_API zend_constant *_zend_get_special_const(const char *name, size_t name_le static zend_always_inline zend_constant *zend_get_special_const( const char *name, size_t name_len) { - if (name_len == 4 || name_len == 5) { + + // Английские: 4 (true, null), 5 (false) + // Русские: 8 (ложь), 10 (пусто), 12 (правда) + if (name_len == 4 || name_len == 5 || + name_len == 8 || name_len == 10 || name_len == 12) { return _zend_get_special_const(name, name_len); } return NULL; diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 07f2d44c..38cdcf9e 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1395,27 +1395,27 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ /* compute yyleng before each rule */ := yyleng = YYCURSOR - SCNG(yy_text); -"exit" { +"exit"|"выход" { RETURN_TOKEN_WITH_IDENT(T_EXIT); } -"die" { +"die"|"стоп" { RETURN_TOKEN_WITH_IDENT(T_EXIT); } -"fn" { +"fn"|"фн" { RETURN_TOKEN_WITH_IDENT(T_FN); } -"function" { +"function"|"функц" { RETURN_TOKEN_WITH_IDENT(T_FUNCTION); } -"const" { +"const"|"конст" { RETURN_TOKEN_WITH_IDENT(T_CONST); } -"return" { +"return"|"возврат" { RETURN_TOKEN_WITH_IDENT(T_RETURN); } @@ -1430,138 +1430,233 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN_WITH_IDENT(T_YIELD_FROM); } -"yield" { +"yield"|"отдать" { RETURN_TOKEN_WITH_IDENT(T_YIELD); } -"try" { +"try"|"проб" { RETURN_TOKEN_WITH_IDENT(T_TRY); } -"catch" { +"catch"|"отлов" { RETURN_TOKEN_WITH_IDENT(T_CATCH); } -"finally" { +"finally"|"к_проб" { RETURN_TOKEN_WITH_IDENT(T_FINALLY); } -"throw" { +"throw"|"бросить" { RETURN_TOKEN_WITH_IDENT(T_THROW); } -"if" { +"if"|"если" { RETURN_TOKEN_WITH_IDENT(T_IF); } -"elseif" { +"elseif"|"и_если" { RETURN_TOKEN_WITH_IDENT(T_ELSEIF); } -"endif" { +"endif"|"к_если" { RETURN_TOKEN_WITH_IDENT(T_ENDIF); } -"else" { +"else"|"иначе" { RETURN_TOKEN_WITH_IDENT(T_ELSE); } -"while" { +"while"|"пока" { RETURN_TOKEN_WITH_IDENT(T_WHILE); } -"endwhile" { +"endwhile"|"к_пока" { RETURN_TOKEN_WITH_IDENT(T_ENDWHILE); } -"do" { +"do"|"делать" { RETURN_TOKEN_WITH_IDENT(T_DO); } -"for" { +"for"|"для" { RETURN_TOKEN_WITH_IDENT(T_FOR); } -"endfor" { +"endfor"|"к_для" { RETURN_TOKEN_WITH_IDENT(T_ENDFOR); } -"foreach" { +"foreach"|"д_кажд" { RETURN_TOKEN_WITH_IDENT(T_FOREACH); } -"endforeach" { +"endforeach"|"к_д_кажд" { RETURN_TOKEN_WITH_IDENT(T_ENDFOREACH); } -"declare" { +"declare"|"объяв" { RETURN_TOKEN_WITH_IDENT(T_DECLARE); } -"enddeclare" { +"enddeclare"|"к_объяв" { RETURN_TOKEN_WITH_IDENT(T_ENDDECLARE); } -"instanceof" { +"instanceof"|"экз" { RETURN_TOKEN_WITH_IDENT(T_INSTANCEOF); } -"as" { +"as"|"как" { RETURN_TOKEN_WITH_IDENT(T_AS); } -"switch" { +"switch"|"перекл" { RETURN_TOKEN_WITH_IDENT(T_SWITCH); } -"match" { +"match"|"сопостав" { RETURN_TOKEN_WITH_IDENT(T_MATCH); } -"endswitch" { +"endswitch"|"к_перекл" { RETURN_TOKEN_WITH_IDENT(T_ENDSWITCH); } -"case" { +"case"|"случай" { RETURN_TOKEN_WITH_IDENT(T_CASE); } -"default" { +"default"|"по_умолч" { RETURN_TOKEN_WITH_IDENT(T_DEFAULT); } -"break" { +"break"|"брейк" { RETURN_TOKEN_WITH_IDENT(T_BREAK); } -"continue" { +"continue"|"далее" { RETURN_TOKEN_WITH_IDENT(T_CONTINUE); } -"goto" { +"goto"|"переход" { RETURN_TOKEN_WITH_IDENT(T_GOTO); } -"echo" { +"echo"|"эхо" { RETURN_TOKEN_WITH_IDENT(T_ECHO); } -"print" { +"print"|"печать" { RETURN_TOKEN_WITH_IDENT(T_PRINT); } -"class" { +"class"|"класс" { RETURN_TOKEN_WITH_IDENT(T_CLASS); } -"interface" { +"interface"|"интерфейс" { RETURN_TOKEN_WITH_IDENT(T_INTERFACE); } -"trait" { +"trait"|"примесь" { RETURN_TOKEN_WITH_IDENT(T_TRAIT); } +"extends"|"расшир" { + RETURN_TOKEN_WITH_IDENT(T_EXTENDS); +} + +"implements"|"реализ" { + RETURN_TOKEN_WITH_IDENT(T_IMPLEMENTS); +} + +"abstract"|"абстракт" { + RETURN_TOKEN_WITH_IDENT(T_ABSTRACT); +} + +"final"|"окончат" { + RETURN_TOKEN_WITH_IDENT(T_FINAL); +} + +"static"|"статич" { + RETURN_TOKEN_WITH_IDENT(T_STATIC); +} + +"public"|"публ" { + RETURN_TOKEN_WITH_IDENT(T_PUBLIC); +} + +"protected"|"защищ" { + RETURN_TOKEN_WITH_IDENT(T_PROTECTED); +} + +"private"|"приватн" { + RETURN_TOKEN_WITH_IDENT(T_PRIVATE); +} + +"readonly"|"т_чтение" { + RETURN_TOKEN_WITH_IDENT(T_READONLY); +} + +"namespace"|"п_имён" { + RETURN_TOKEN_WITH_IDENT(T_NAMESPACE); +} + +"use"|"использ" { + RETURN_TOKEN_WITH_IDENT(T_USE); +} + +"insteadof"|"вместоД" { + RETURN_TOKEN_WITH_IDENT(T_INSTEADOF); +} + +"global"|"глобал" { + RETURN_TOKEN_WITH_IDENT(T_GLOBAL); +} + +"var"|"перем" { + RETURN_TOKEN_WITH_IDENT(T_VAR); +} + +"isset"|"устан" { + RETURN_TOKEN_WITH_IDENT(T_ISSET); +} + +"unset"|"удалить" { + RETURN_TOKEN_WITH_IDENT(T_UNSET); +} + +"empty"|"пуст" { + RETURN_TOKEN_WITH_IDENT(T_EMPTY); +} + +"list"|"список" { + RETURN_TOKEN_WITH_IDENT(T_LIST); +} + +"array"|"массив" { + RETURN_TOKEN_WITH_IDENT(T_ARRAY); +} + +"callable"|"вызываемый" { + RETURN_TOKEN_WITH_IDENT(T_CALLABLE); +} + +"clone"|"клон" { + RETURN_TOKEN_WITH_IDENT(T_CLONE); +} + +"new"|"нов" { + RETURN_TOKEN_WITH_IDENT(T_NEW); +} + +"attribute"|"атрибут" { + RETURN_TOKEN_WITH_IDENT(T_ATTRIBUTE); +} + + + + /* * The enum keyword must be followed by whitespace and another identifier. * This avoids the BC break of using enum in classes, namespaces, functions and constants.