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

📄 t2.y

📁 从lex&yacc说到编译器
💻 Y
字号:
%union {    Scope	*scope;    Expr	*expr;    Expr_List	*elist;    Type	*type;    Decl	*decl;    Decl_List	*dlist;    Code	*code;    char	*id;    };%left '+' '-'%left '*' '/' '%'%nonassoc PREFIX%nonassoc POSTFIX '(' '[' '.'%token <id>	ID%token <expr>	CONSTANT%token		EXTERN REGISTER STATIC CONST VOLATILE IF THEN ELSE CLCL%type <expr>	expr(<scope>)%type		decl(<scope>) declarator_list(<scope>, <type>)		decl_list(<scope>)%type <code>	statement(<scope>) statement_list(<scope>)		block_statement(<scope>)%type <decl>	declarator(<scope>, <type>) formal_arg(<scope>)%type <type>	decl_specs(<scope>) decl_spec(<scope>) typename(<scope>)		cv_quals cv_qual%type <scope>	opt_scope(<scope>)%type <dlist>	formal_arg_list(<scope>) nonempty_formal_arg_list(<scope>)%start input%%opt_scope($e):		[ $$ = $e; ]  | CLCL		[ $$ = global_scope; ]  | opt_scope ID CLCL	[ Decl *d = lookup($1, $2);			  if (!d || !d->scope) YERROR;			  $$ = d->scope; ]  ;typename($e): opt_scope ID      [ Decl *d = lookup($1, $2);	if (!d || !d->istype()) YYERROR;	$$ = d->type; ]  ;input: decl_list(global_scope = new_scope(0)) ;decl_list($e): | decl_list decl($e) ;decl($e):    decl_specs declarator_list($e,$1) ';' [YYVALID;]  | decl_specs declarator($e,$1) block_statement(start_fn_def($e, $2))      { finish_fn_def($2, $3); }  ;decl_specs($e):	    decl_spec			[ $$ = $1; ]  | decl_specs decl_spec($e)	[ $$ = type_combine($1, $2); ]  ;cv_quals:			[ $$ = 0; ]  | cv_quals cv_qual		[ $$ = type_combine($1, $2); ]  ;decl_spec($e):    cv_qual		[ $$ = $1; ]  | typename		[ $$ = $1; ]  | EXTERN		[ $$ = bare_extern(); ]  | REGISTER		[ $$ = bare_register(); ]  | STATIC		[ $$ = bare_static(); ]  ;cv_qual:    CONST		[ $$ = bare_const(); ]  | VOLATILE		[ $$ = bare_volatile(); ]  ;declarator_list($e, $t):    declarator_list ',' declarator($e, $t)  | declarator  ;declarator($e, $t):    /* empty */			[ if (!$t) YYERROR; ]					{ $$ = declare($e, 0, $t); }  | ID				{ $$ = declare($e, $1, $t); }  | '(' declarator($e, $t) ')'	{ $$ = $2; }  | '*' cv_quals declarator($e, $t) %prec PREFIX	  { $$ = make_pointer($3, $2); }  | declarator '[' expr($e) ']'	  { $$ = make_array($1->type, $3); }  | declarator '(' formal_arg_list($e) ')' cv_quals	  { $$ = build_function($1, $3, $5); }  ;formal_arg_list($e):		{ $$ = 0; }  | nonempty_formal_arg_list	{ $$ = $1; }  ;nonempty_formal_arg_list($e):    nonempty_formal_arg_list ',' formal_arg($e)	{ $$ = append_dlist($1, $3); }  | formal_arg					{ $$ = build_dlist($1); }  ;formal_arg($e):    decl_specs declarator($e,$1)	{ $$ = $2; }  ;expr($e):    expr '+' expr($e)		{ $$ = build_expr($1, ADD, $3); }  | expr '-' expr($e)		{ $$ = build_expr($1, SUB, $3); }  | expr '*' expr($e)		{ $$ = build_expr($1, MUL, $3); }  | expr '%' expr($e)		{ $$ = build_expr($1, MOD, $3); }  | expr '/' expr($e)		{ $$ = build_expr($1, DIV, $3); }  | '*' expr($e) %prec PREFIX	{ $$ = build_expr(0, REF, $2); }  | ID				{ $$ = var_expr($e, $1); }  | CONSTANT			{ $$ = $1; }  ;statement($e):    decl			{ $$ = 0; }  | expr($e) ';' [YYVALID;]	{ $$ = build_expr_code($1); }  | IF '(' expr($e) ')' THEN statement($e) ELSE statement($e) [YYVALID;]    { $$ = build_if($3, $6, $8); }  | IF '(' expr($e) ')' THEN statement($e) [YYVALID;]    { $$ = build_if($3, $6, 0); }  | block_statement(new_scope($e)) [YYVALID;]{ $$ = $1; }  ;statement_list($e):			{ $$ = 0; }  | statement_list statement($e)	{ $$ = code_append($1, $2); }  ;block_statement($e):    '{' statement_list($e) '}' { $$ = $2; }  ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -