Патч для русского синтаксиса

This commit is contained in:
mzhoot 2026-05-31 18:41:26 +03:00
parent b79de0bea5
commit 25854d0b99
3 changed files with 170 additions and 54 deletions

View file

@ -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;
}
/* }}} */

View file

@ -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;

View file

@ -1395,27 +1395,27 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_
/* compute yyleng before each rule */
<!*> := yyleng = YYCURSOR - SCNG(yy_text);
<ST_IN_SCRIPTING>"exit" {
<ST_IN_SCRIPTING>"exit"|"выход" {
RETURN_TOKEN_WITH_IDENT(T_EXIT);
}
<ST_IN_SCRIPTING>"die" {
<ST_IN_SCRIPTING>"die"|"стоп" {
RETURN_TOKEN_WITH_IDENT(T_EXIT);
}
<ST_IN_SCRIPTING>"fn" {
<ST_IN_SCRIPTING>"fn"|"фн" {
RETURN_TOKEN_WITH_IDENT(T_FN);
}
<ST_IN_SCRIPTING>"function" {
<ST_IN_SCRIPTING>"function"|"функц" {
RETURN_TOKEN_WITH_IDENT(T_FUNCTION);
}
<ST_IN_SCRIPTING>"const" {
<ST_IN_SCRIPTING>"const"|"конст" {
RETURN_TOKEN_WITH_IDENT(T_CONST);
}
<ST_IN_SCRIPTING>"return" {
<ST_IN_SCRIPTING>"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);
}
<ST_IN_SCRIPTING>"yield" {
<ST_IN_SCRIPTING>"yield"|"отдать" {
RETURN_TOKEN_WITH_IDENT(T_YIELD);
}
<ST_IN_SCRIPTING>"try" {
<ST_IN_SCRIPTING>"try"|"проб" {
RETURN_TOKEN_WITH_IDENT(T_TRY);
}
<ST_IN_SCRIPTING>"catch" {
<ST_IN_SCRIPTING>"catch"|"отлов" {
RETURN_TOKEN_WITH_IDENT(T_CATCH);
}
<ST_IN_SCRIPTING>"finally" {
<ST_IN_SCRIPTING>"finally"|"к_проб" {
RETURN_TOKEN_WITH_IDENT(T_FINALLY);
}
<ST_IN_SCRIPTING>"throw" {
<ST_IN_SCRIPTING>"throw"|"бросить" {
RETURN_TOKEN_WITH_IDENT(T_THROW);
}
<ST_IN_SCRIPTING>"if" {
<ST_IN_SCRIPTING>"if"|"если" {
RETURN_TOKEN_WITH_IDENT(T_IF);
}
<ST_IN_SCRIPTING>"elseif" {
<ST_IN_SCRIPTING>"elseif"|"и_если" {
RETURN_TOKEN_WITH_IDENT(T_ELSEIF);
}
<ST_IN_SCRIPTING>"endif" {
<ST_IN_SCRIPTING>"endif"|"к_если" {
RETURN_TOKEN_WITH_IDENT(T_ENDIF);
}
<ST_IN_SCRIPTING>"else" {
<ST_IN_SCRIPTING>"else"|"иначе" {
RETURN_TOKEN_WITH_IDENT(T_ELSE);
}
<ST_IN_SCRIPTING>"while" {
<ST_IN_SCRIPTING>"while"|"пока" {
RETURN_TOKEN_WITH_IDENT(T_WHILE);
}
<ST_IN_SCRIPTING>"endwhile" {
<ST_IN_SCRIPTING>"endwhile"|"к_пока" {
RETURN_TOKEN_WITH_IDENT(T_ENDWHILE);
}
<ST_IN_SCRIPTING>"do" {
<ST_IN_SCRIPTING>"do"|"делать" {
RETURN_TOKEN_WITH_IDENT(T_DO);
}
<ST_IN_SCRIPTING>"for" {
<ST_IN_SCRIPTING>"for"|"для" {
RETURN_TOKEN_WITH_IDENT(T_FOR);
}
<ST_IN_SCRIPTING>"endfor" {
<ST_IN_SCRIPTING>"endfor"|"к_для" {
RETURN_TOKEN_WITH_IDENT(T_ENDFOR);
}
<ST_IN_SCRIPTING>"foreach" {
<ST_IN_SCRIPTING>"foreach"|"д_кажд" {
RETURN_TOKEN_WITH_IDENT(T_FOREACH);
}
<ST_IN_SCRIPTING>"endforeach" {
<ST_IN_SCRIPTING>"endforeach"|"к_д_кажд" {
RETURN_TOKEN_WITH_IDENT(T_ENDFOREACH);
}
<ST_IN_SCRIPTING>"declare" {
<ST_IN_SCRIPTING>"declare"|"объяв" {
RETURN_TOKEN_WITH_IDENT(T_DECLARE);
}
<ST_IN_SCRIPTING>"enddeclare" {
<ST_IN_SCRIPTING>"enddeclare"|"к_объяв" {
RETURN_TOKEN_WITH_IDENT(T_ENDDECLARE);
}
<ST_IN_SCRIPTING>"instanceof" {
<ST_IN_SCRIPTING>"instanceof"|"экз" {
RETURN_TOKEN_WITH_IDENT(T_INSTANCEOF);
}
<ST_IN_SCRIPTING>"as" {
<ST_IN_SCRIPTING>"as"|"как" {
RETURN_TOKEN_WITH_IDENT(T_AS);
}
<ST_IN_SCRIPTING>"switch" {
<ST_IN_SCRIPTING>"switch"|"перекл" {
RETURN_TOKEN_WITH_IDENT(T_SWITCH);
}
<ST_IN_SCRIPTING>"match" {
<ST_IN_SCRIPTING>"match"|"сопостав" {
RETURN_TOKEN_WITH_IDENT(T_MATCH);
}
<ST_IN_SCRIPTING>"endswitch" {
<ST_IN_SCRIPTING>"endswitch"|"к_перекл" {
RETURN_TOKEN_WITH_IDENT(T_ENDSWITCH);
}
<ST_IN_SCRIPTING>"case" {
<ST_IN_SCRIPTING>"case"|"случай" {
RETURN_TOKEN_WITH_IDENT(T_CASE);
}
<ST_IN_SCRIPTING>"default" {
<ST_IN_SCRIPTING>"default"|"по_умолч" {
RETURN_TOKEN_WITH_IDENT(T_DEFAULT);
}
<ST_IN_SCRIPTING>"break" {
<ST_IN_SCRIPTING>"break"|"брейк" {
RETURN_TOKEN_WITH_IDENT(T_BREAK);
}
<ST_IN_SCRIPTING>"continue" {
<ST_IN_SCRIPTING>"continue"|"далее" {
RETURN_TOKEN_WITH_IDENT(T_CONTINUE);
}
<ST_IN_SCRIPTING>"goto" {
<ST_IN_SCRIPTING>"goto"|"переход" {
RETURN_TOKEN_WITH_IDENT(T_GOTO);
}
<ST_IN_SCRIPTING>"echo" {
<ST_IN_SCRIPTING>"echo"|"эхо" {
RETURN_TOKEN_WITH_IDENT(T_ECHO);
}
<ST_IN_SCRIPTING>"print" {
<ST_IN_SCRIPTING>"print"|"печать" {
RETURN_TOKEN_WITH_IDENT(T_PRINT);
}
<ST_IN_SCRIPTING>"class" {
<ST_IN_SCRIPTING>"class"|"класс" {
RETURN_TOKEN_WITH_IDENT(T_CLASS);
}
<ST_IN_SCRIPTING>"interface" {
<ST_IN_SCRIPTING>"interface"|"интерфейс" {
RETURN_TOKEN_WITH_IDENT(T_INTERFACE);
}
<ST_IN_SCRIPTING>"trait" {
<ST_IN_SCRIPTING>"trait"|"примесь" {
RETURN_TOKEN_WITH_IDENT(T_TRAIT);
}
<ST_IN_SCRIPTING>"extends"|"расшир" {
RETURN_TOKEN_WITH_IDENT(T_EXTENDS);
}
<ST_IN_SCRIPTING>"implements"|"реализ" {
RETURN_TOKEN_WITH_IDENT(T_IMPLEMENTS);
}
<ST_IN_SCRIPTING>"abstract"|"абстракт" {
RETURN_TOKEN_WITH_IDENT(T_ABSTRACT);
}
<ST_IN_SCRIPTING>"final"|"окончат" {
RETURN_TOKEN_WITH_IDENT(T_FINAL);
}
<ST_IN_SCRIPTING>"static"|"статич" {
RETURN_TOKEN_WITH_IDENT(T_STATIC);
}
<ST_IN_SCRIPTING>"public"|"публ" {
RETURN_TOKEN_WITH_IDENT(T_PUBLIC);
}
<ST_IN_SCRIPTING>"protected"|"защищ" {
RETURN_TOKEN_WITH_IDENT(T_PROTECTED);
}
<ST_IN_SCRIPTING>"private"|"приватн" {
RETURN_TOKEN_WITH_IDENT(T_PRIVATE);
}
<ST_IN_SCRIPTING>"readonly"|"т_чтение" {
RETURN_TOKEN_WITH_IDENT(T_READONLY);
}
<ST_IN_SCRIPTING>"namespace"|"п_имён" {
RETURN_TOKEN_WITH_IDENT(T_NAMESPACE);
}
<ST_IN_SCRIPTING>"use"|"использ" {
RETURN_TOKEN_WITH_IDENT(T_USE);
}
<ST_IN_SCRIPTING>"insteadof"|"вместоД" {
RETURN_TOKEN_WITH_IDENT(T_INSTEADOF);
}
<ST_IN_SCRIPTING>"global"|"глобал" {
RETURN_TOKEN_WITH_IDENT(T_GLOBAL);
}
<ST_IN_SCRIPTING>"var"|"перем" {
RETURN_TOKEN_WITH_IDENT(T_VAR);
}
<ST_IN_SCRIPTING>"isset"|"устан" {
RETURN_TOKEN_WITH_IDENT(T_ISSET);
}
<ST_IN_SCRIPTING>"unset"|"удалить" {
RETURN_TOKEN_WITH_IDENT(T_UNSET);
}
<ST_IN_SCRIPTING>"empty"|"пуст" {
RETURN_TOKEN_WITH_IDENT(T_EMPTY);
}
<ST_IN_SCRIPTING>"list"|"список" {
RETURN_TOKEN_WITH_IDENT(T_LIST);
}
<ST_IN_SCRIPTING>"array"|"массив" {
RETURN_TOKEN_WITH_IDENT(T_ARRAY);
}
<ST_IN_SCRIPTING>"callable"|"вызываемый" {
RETURN_TOKEN_WITH_IDENT(T_CALLABLE);
}
<ST_IN_SCRIPTING>"clone"|"клон" {
RETURN_TOKEN_WITH_IDENT(T_CLONE);
}
<ST_IN_SCRIPTING>"new"|"нов" {
RETURN_TOKEN_WITH_IDENT(T_NEW);
}
<ST_IN_SCRIPTING>"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.