📄 php_parser.y
字号:
| VARIABLE '=' const_value { $1->var_node->flags |= PHP_VARFLAG_STATIC; $$ = $1; value_value_assign(&$1->var_node->value, &$3->val_node); };function_decl_statement: FUNCTION IDENT { switch_push_scope_table(make_scope_table()) } '(' parameter_list ')' '{' top_statement_list '}' { $$ = make_func_decl_syn_node($2, $5); $$->func_decl->scope = g_current_scope; $$->func_decl->is_native = 0; $$->func_decl->code = $8; switch_pop_scope_table(0); add_func_2_scope(g_current_scope, $$); $$ = 0; } | FUNCTION '&' IDENT '(' parameter_list ')' '{' top_statement_list '}' { };parameter_list: optional_class_type VARIABLE { $$ = make_func_param(0, $2, $1, 0); } | optional_class_type '&' VARIABLE { $$ = make_func_param(0, $3, $1, 1); } | parameter_list ',' optional_class_type VARIABLE { $$ = make_func_param($1, $4, $3, 0); } | parameter_list ',' optional_class_type '&' VARIABLE { $$ = make_func_param($1, $5, $3, 1); } | /* empty */ { $$ = 0; };optional_class_type: /* empty */ { $$[0] = 0; } | IDENT;for_statement: statement | ':' top_statement_list ENDFOR ';' { $$ = $2; };foreach_statement: statement | ':' top_statement_list ENDFOREACH ';' { $$ = $2; };for_expr: expr_list | /* empty */ { $$ = 0; };elseif_list: elseif_list ELSEIF '(' expr ')' statement { $$ = add_branch_2_elseif($1, make_ifelse_syn_node($4, $6, 0, 0)); } | /* empty */ { $$ = 0; };else_statement: /* empty */ { $$ = 0; } | ELSE statement { $$ = $2; };while_statement: statement | ':' top_statement_list ENDWHILE ';' { $$ = $2; };switch_case_list: '{' case_list '}' { $$ = $2; } | '{' ';' case_list '}' { $$ = $3; } | ':' case_list ENDSWITCH ';' { $$ = $2; } | ':' ';' case_list ENDSWITCH ';' { $$ = $3; };case_list: /* empty */ { $$ = 0; } | case_list case_list_item case_separator top_statement_list { $2->tree_node.syn_right = $4; if ( $1 ) { PHP_EXP_NODE *last = $1; while ( last->next) last = last->next; last->next = make_exp_1(PHP_OP_LIST, 0); last->next->exp_node = $2; $$ = $1; } else { $$ = make_exp_1(PHP_OP_LIST, 0); $$->exp_node = $2; } };case_list_item: CASE expr { $$ = make_exp_2(PHP_OP_LIST, $2, 0); } | DEFAULT { $$ = make_exp_2(PHP_OP_LIST, 0, 0); }; case_separator: ':' | ';';const_value: FNUMBER | DNUMBER | STRING | IDENT { $$ = make_known_const($1); };variable: deref_variable | IDENT CLASS_SCOPE IDENT { $$ = make_exp_2(PHP_OP_CLASS_DEREF, make_const_exp_str($1, 0), make_const_exp_str($3, 0)); } | deref_variable OBJECT_OPERATOR IDENT { $$ = make_exp_2(PHP_OP_OBJECT_DEREF, $1, make_const_exp_str($3, 0)); };deref_variable: VARIABLE | deref_variable '[' ']' { $$ = make_exp_2(PHP_OP_ARRAY_BY_KEY, $1, 0); } | deref_variable '[' expr ']' { $$ = make_exp_2(PHP_OP_ARRAY_BY_KEY, $1, $3);} | deref_variable '{' expr '}' { $$ = make_exp_2(PHP_OP_ARRAY_BY_KEY, $1, $3);} | '$' '{' expr '}' { $$ = make_exp_1(PHP_OP_VAR_BY_EXP, $3); };function_call: IDENT '(' func_param_list ')' { $$ = make_func_call_exp($1, $3); } | deref_variable CLASS_SCOPE IDENT '(' func_param_list ')' { } | deref_variable OBJECT_OPERATOR IDENT '(' func_param_list ')' { };func_param_list: expr { $$ = make_func_call_param_list(); func_call_add_expr($$->var_node, $1, 0); } | '&' variable { $$ = make_func_call_param_list(); func_call_add_expr($$->var_node, $2, 1); } | func_param_list ',' expr { $$ = $1; func_call_add_expr($$->var_node, $3, 0); } | func_param_list ',' '&' variable { $$ = $1; func_call_add_expr($$->var_node, $4, 1); } | /* empty */ { $$ = make_func_call_param_list(); };expr: LIST '(' assignment_list ')' '=' expr { } | variable | variable '=' expr { $$ = make_exp_2(PHP_OP_ASS, $1, $3); } | function_call { $$ = $1; } | variable '=' '&' variable { $$ = make_exp_2(PHP_MAKE_REF, $1, $4); }/* | NEW class_name_reference ctor_arguments { } | CLONE expr { }*/ | variable PLUS_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_ADD, $1, $3)); } | variable MINUS_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SUB, $1, $3)); } | variable MUL_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_MUL, $1, $3)); } | variable DIV_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_DIV, $1, $3)); } | variable CONCAT_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_CAT, $1, $3)); } | variable MOD_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_REM, $1, $3)); } | variable AND_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_AND, $1, $3)); } | variable OR_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_OR, $1, $3)); } | variable XOR_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_XOR, $1, $3)); } | variable SL_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SHL, $1, $3)); } | variable SR_EQ expr { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SHR, $1, $3)); } /* ++var and var++ looks same to me */ | variable INC { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_ADD, $1, make_const_exp_dnum(1))); } | INC variable { $$ = make_exp_2_self(PHP_OP_ASS, $2, make_exp_2(PHP_OP_ADD, $2, make_const_exp_dnum(1))); } | variable DEC { $$ = make_exp_2_self(PHP_OP_ASS, $1, make_exp_2(PHP_OP_SUB, $1, make_const_exp_dnum(1))); } | DEC variable { $$ = make_exp_2_self(PHP_OP_ASS, $2, make_exp_2(PHP_OP_SUB, $2, make_const_exp_dnum(1))); } | expr BOOLEAN_OR expr { $$ = make_exp_2(PHP_OP_LOG_OR, $1, $3); } | expr BOOLEAN_AND expr { $$ = make_exp_2(PHP_OP_LOG_AND, $1, $3); } | expr LOG_OR expr { $$ = make_exp_2(PHP_OP_LOG_OR, $1, $3); } | expr LOG_AND expr { $$ = make_exp_2(PHP_OP_LOG_AND, $1, $3); } | expr LOG_XOR expr { $$ = make_exp_2(PHP_OP_LOG_XOR, $1, $3); } | expr '|' expr { $$ = make_exp_2(PHP_OP_OR, $1, $3); } | expr '&' expr { $$ = make_exp_2(PHP_OP_AND, $1, $3); } | expr '^' expr { $$ = make_exp_2(PHP_OP_XOR, $1, $3); } | expr '.' expr { $$ = make_exp_2(PHP_OP_CAT, $1, $3); } | expr '+' expr { $$ = make_exp_2(PHP_OP_ADD, $1, $3); } | expr '-' expr { $$ = make_exp_2(PHP_OP_SUB, $1, $3); } | expr '*' expr { $$ = make_exp_2(PHP_OP_MUL, $1, $3); } | expr '/' expr { $$ = make_exp_2(PHP_OP_DIV, $1, $3); } | expr '%' expr { $$ = make_exp_2(PHP_OP_REM, $1, $3); } | expr SL expr { $$ = make_exp_2(PHP_OP_SHL, $1, $3); } | expr SR expr { $$ = make_exp_2(PHP_OP_SHR, $1, $3); } | '+' expr { $$ = $2; } | '-' expr { $$ = make_exp_2(PHP_OP_SUB, make_const_exp_dnum(0), $2); } | '!' expr { $$ = make_exp_1(PHP_OP_LOG_NOT, $2); } | '~' expr { $$ = make_exp_1(PHP_OP_NOT, $2); } | expr IS_IDENTICAL expr { $$ = make_exp_2(PHP_OP_SAME, $1, $3); } | expr IS_NOIDENTICAL expr { $$ = make_exp_2(PHP_OP_NOT_SAME, $1, $3); } | expr IS_EQ expr { $$ = make_exp_2(PHP_OP_EQ, $1, $3); } | expr IS_NOEQUAL expr { $$ = make_exp_2(PHP_OP_NEQ, $1, $3); } | expr '<' expr { $$ = make_exp_2(PHP_OP_LWR, $1, $3); } | expr IS_SMALLER_OR_EQ expr { $$ = make_exp_2(PHP_OP_LWR_EQ, $1, $3); } | expr '>' expr { $$ = make_exp_2(PHP_OP_GRT, $1, $3); } | expr IS_GREATER_OR_EQ expr { $$ = make_exp_2(PHP_OP_GRT_EQ, $1, $3); } | '(' expr ')' { $$ = $2; } | expr '?' expr ':' expr { $$ = make_exp_2(PHP_OP_MUX, $3, $5); $$->exp_node = $1; } | INT_CAST expr { $$ = make_exp_1(PHP_OP_CAST_INT, $2); } | DOUBLE_CAST expr { $$ = make_exp_1(PHP_OP_CAST_FLOAT, $2); } | STRING_CAST expr { $$ = make_exp_1(PHP_OP_CAST_STR, $2); } | BOOL_CAST expr { $$ = make_exp_1(PHP_OP_CAST_BOOL, $2); }/* | ARRAY_CAST expr { } *//* | OBJECT_CAST expr { } */ | UNSET_CAST expr { } | EXIT exit_expr { } | '@' expr { $$ = $2; } | const_value { $$ = $1; } | ARRAY '(' array_pair_list ')' { $$ = make_exp_1(PHP_OP_ARRAY, $3); } | PRINT expr { $$ = make_exp_1(PHP_OP_PRINT, $2); };exit_expr: '(' expr ')' { $$ = $2; } | '(' ')' { $$ = 0; } | /* empty */ { $$ = 0; } ;assignment_list: assignment_list_element | assignment_list ',' assignment_list_element;assignment_list_element: variable { /*$$ = make_assign_node($1);*/ } | LIST '(' assignment_list ')' { $$ = $3; } | /* empty */ { /*$$ = make_assign_node(0);*/ };array_pair_list: array_elem { $$ = make_exp_1(PHP_OP_LIST, 0); $$->exp_node = $1; } | array_pair_list ',' array_elem { PHP_EXP_NODE *last = $1; while ( last->next) last = last->next; last->next = make_exp_1(PHP_OP_LIST, 0); last->next->exp_node = $3; $$ = $1; };array_elem : expr { $$ = make_exp_1(PHP_OP_ARRAY_PAIR, $1); } | expr HASH_ASSIGN expr { $$ = make_exp_2(PHP_OP_ARRAY_PAIR, $1, $3); } | expr HASH_ASSIGN '&' variable { $$ = make_exp_2(PHP_OP_ARRAY_REF_PAIR, $1, $4); } | '&' variable { $$ = make_exp_1(PHP_OP_ARRAY_REF_PAIR, $2); };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -