⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 php_parser.y

📁 电驴的MAC源代码
💻 Y
📖 第 1 页 / 共 2 页
字号:
	|	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 + -