亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c.y

?? C編譯器,在VC6.0環境下開發
?? Y
?? 第 1 頁 / 共 5 頁
字號:
/*
 * C.Y
 * Grammar file for C Compiler
 *
 * Copyright (c) 2001 by Ren Qi and Lin Ying
 * All Rights Reserved.
 *
 */

%{
#include    "Common.h"
#include    "Debug.h"
#include	"Error.h"
#include	"SymTab.h"
#include	"GBStrTab.h"
#include	"GenCode.h"
#include	"stack.h"
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <assert.h>

extern  char* yytext;

// globe value 
// used by cSTRING , record current string context
char	g_String[MAX_STR_LEN];
const	char _FUNCTION_NAME[] = "func_%s";
const	char _CASE_NAME[] = "_case_";
const	char _DEFAULT_NAME[] = "_default_";
const	char _STRING_NAME[] = "_string_";

#define		IS_CASE(x)		( !strcmp( (x)->name, _CASE_NAME ) )
#define		IS_DEFAULT(x)	( !strcmp( (x)->name, _DEFAULT_NAME ) )

// label buffer for return
static	char	sg_return_label_buf[LABEL_LEN];

// used by function, to add parameter list to compound statement
static	symbol	*sg_parameter_list = NULL;

#define	PARSE_INFO(x)	StrToDebug(x, "\nIn yyparse() : ", "  --- YACC");

void	set_return_label(char *lb);
void	gen_return_label();
void	gen_return_stmt(symbol *x);
char	*get_string_context(char *s);
int		yylex();

%}

%union
{
// note : NAME_LEN == 32
	char		p_char[32];
	int			num;
	int			ascii;
	symbol		*p_symbol;
}


/* Definition of terminals */
%term	<p_char>idTYPEDEF

%term	kFOR
%term	kWHILE
%term	kIF
%term	kELSE
%term	kCASE
%term	kSWITCH
%term	kDEFAULT
%term	kGOTO
%term	kRETURN
%term	kDO
%term	kBREAK
%term	kCONTINUE
%term	kSIZEOF

%term	kAUTO
%term	kREGISTER
%term	kSTATIC
%term	kEXTERN
%term	kTYPEDEF

%term	kINT
%term	kLONG
%term	kSHORT
%term	kCHAR
%term	kVOID
%term	kFLOAT
%term	kDOUBLE
%term	kSIGNED
%term	kUNSIGNED

%term	kCONST
%term	kVOLATILE

%term   cSTRING					/* STRING CONSTANT */
%term   <num>cINT				/* INT CONSTANT */
%term   <p_char>cREAL			/* REAL CONSTANT */
%term   <p_char>cCHAR			/* CHAR CONSTANT */

%term	oPLUS
%term	oMINUS
%term	oMUL
%term	oDIV
%term	oMOD
%term	oEQUAL
%term	oASSIGN
%term	oUNEQU
%term   oLT
%term   oLE
%term   oGT
%term   oGE
%term   oCOMMA
%term	oSEMI
%term	oCOLON
%term	oQUESTION
%term	oQUOTE
%term	oDOTDOTDOT
%term	oARROW
%term	oLP
%term	oRP
%term	oLB
%term	oRB
%term	oLC
%term	oRC

%term	oBITOR
%term	oBITAND
%term	oBITNOT
%term	oBITXOR
%term	oLFTSHT
%term	oRITSHT

%term	oOR
%term	oAND
%term	oNOT

%term	oADDADD
%term	oSUBSUB

%term	oPLUSASSIGN
%term	oMINUSASSIGN
%term	oMULASSIGN
%term	oDIVASSIGN
%term	oMODASSIGN
%term	oBITORASSIGN
%term	oBITANDASSIGN
%term	oBITNOTASSIGN
%term	oBITXORASSIGN
%term	oLFTSHTASSIGN
%term	oRITSHTASSIGN

%term   <p_char>yNAME

/* preprocessor */
%term	pINCLUDE
%term	pINCLDNAME

/* Definition of nonterminals */

%type	<p_symbol>storage_class_specifier type_specifier type_qualifier
%type	<p_symbol>declaration_specifiers
%type	<p_char>identifier
%type	<p_symbol>direct_declarator	declarator init_declarator init_declarator_list
%type	<p_symbol>declaration declaration_list
%type	<p_symbol>parameter_declaration parameter_list parameter_type_list
%type	<p_symbol>abstract_declarator direct_abstract_declarator
%type	<p_symbol>initializer
%type	<p_symbol>function_definition

%type	<p_symbol>constant primary_expression postfix_expression unary_expression
%type	<p_symbol>cast_expression multiplicative_expression additive_expression
%type	<p_symbol>shift_expression relational_expression equality_expression
%type	<p_symbol>AND_expression exclusive_OR_expression inclusive_OR_expression
%type	<p_symbol>logical_AND_expression logical_OR_expression constant_expression
%type	<p_symbol>conditional_expression assignment_expression
%type	<p_symbol>expression
%type	<p_symbol>argument_expression_list
/*%type	<num>unary_operator*/
/*%type	<num>assignment_operator*/

/*
	// no attribute nonterminals
	translation_unit
	external_declaration

	statement
	labeled_statement
	expression_statement
	statement_list
	iteration_statement
	jump_statement
*/

%start translation_unit

%%

translation_unit
		:	external_declaration
			{
				PARSE_INFO("translation_unit :external_declaration")
			}
		|	translation_unit external_declaration
			{
				PARSE_INFO("translation_unit :translation_unit external_declaration")
			}
		;

external_declaration
		:	function_definition
			{
				PARSE_INFO("external_declaration :function_definition")
			}
		|	declaration
			{
				PARSE_INFO("external_declaration :declaration")
				// gen globe value
				gen_globe_var_list($1);
			}
		|	control_line
			{
				PARSE_INFO("external_declaration :control_line")
			}
		;

function_definition
		:	declaration_specifiers declarator 
			{
				PARSE_INFO("function_definition :declaration_specifiers declarator ")
				assert( IS_FUNCTION($2) );
				unoin_specifier_to_declarator($1, $2);
				del_symbol( $1 );
				check_function_retval($2);
				// $2->args point to parameter list
				// so we can tell the compound statement to link the parameters
				// assign $2->args to sg_parameter_list to tell compound statement
				sg_parameter_list = $2->args;
				// add function definition to sg_function_symtab
				// for function call itself
				// can search in function definition table
				$2 = add_function_def_to_functab($2);
				// for compound statement code genc in code2 files
				open_code2();
				
				// set return label
				set_return_label(get_a_label());
				// create goto label symtab
				create_goto_label_symtab();
			}
			compound_statement
			{
				PARSE_INFO("compound_statement")

				// destory the goto label
				destory_goto_label_symtab();
				// gen return label
				gen_return_label();

				// set func offset
				set_func_offset($2);
				// gen function head
				gen_func_head($2);
				// copy compound statement in code2 to code
				copy_code2_code();
				// add function end
				gen_func_end($2);
				// since compound statement code has copy to code file,
				// then close code2 for next function
				close_code2();
				$$ = $2;
			}
		|	declarator 
			{
				PARSE_INFO("function_definition :declarator ")
				assert( IS_FUNCTION($1) );
				// default the function return value is int
				$1->NOUN = SPEC_INT;
				// $1->args point to parameter list
				// so we can tell the compound statement to link the parameters
				// assign $1->args to sg_parameter_list to tell compound statement
				sg_parameter_list = $1->args;
				// add function definition to sg_function_symtab
				// for function call itself
				// can search in function definition table
				$1 = add_function_def_to_functab($1);
				// for compound statement code genc in code2 files
				open_code2();

				// set return label
				set_return_label(get_a_label());
				// create goto label symtab
				create_goto_label_symtab();
			}
			compound_statement
			{
				PARSE_INFO("compound_statement")

				// destory the goto label
				destory_goto_label_symtab();
				// gen return label
				gen_return_label();

				// set func offset
				set_func_offset($1);
				// gen function head
				gen_func_head($1);
				// copy compound statement in code2 to code
				copy_code2_code();
				// add function end
				gen_func_end($1);
				// since compound statement code has copy to code file,
				// then close code2 for next function
				close_code2();
			}
		;

declaration
		:	declaration_specifiers init_declarator_list oSEMI
			{
				symbol	*decl_lst;

				PARSE_INFO("declaration :declaration_specifiers init_declarator_list oSEMI")
				// at same time check declarator , not be void
				unoin_specifier_to_declarator_list($1, $2);
				del_symbol( $1 );

				// $2 is a list
				// so add all function in the list to function symtab
				decl_lst = $2;
				while ( decl_lst )
				{
					if (IS_FUNCTION(decl_lst))
					{
						// is function declaration
						// so add it to function declaration symtab

						// set decl flag
						decl_lst->is_declaration = 1;

						// only declaration
						// add or only check parameter type 
						// not overwrite parameters type
						add_function_decl_to_functab(decl_lst);
					}
					else if ( IS_LOCAL_VAR(decl_lst) )
					{
						check_var_declarator(decl_lst);
					}

					decl_lst = decl_lst->next;
				}
				add_symbol_list_to_current_symtab($2);
				$$ = $2;
			}
		|	declaration_specifiers oSEMI
			{
				PARSE_INFO("declaration :declaration_specifiers oSEMI")
				// empty declaration
				// so delete it
				del_symbol( $1 );
				yyerror("waring : ignored on left of specifier when no variable is declared");
				$$ = NULL;
			}
		;

declaration_list
		:	declaration
			{
				PARSE_INFO("declaration_list :declaration")
			}
		|	declaration_list declaration
			{
				PARSE_INFO("declaration_list :declaration_list declaration")
				link_symbol_list( $1, $2 );
			}
		;

declaration_specifiers
		:	storage_class_specifier declaration_specifiers
			{
				PARSE_INFO("declaration_specifiers :storage_class_specifier declaration_specifiers")
				union_specifier_symbol( $1, $2 );
				del_symbol( $2 );
			}
		|	storage_class_specifier
			{
				PARSE_INFO("declaration_specifiers :storage_class_specifier")
			}
		|	type_specifier declaration_specifiers
			{
				PARSE_INFO("declaration_specifiers :type_specifier declaration_specifiers")
				union_specifier_symbol( $1, $2 );
				del_symbol( $2 );
			}
		|	type_specifier
			{
				PARSE_INFO("declaration_specifiers :type_specifier")
			}
		|	type_qualifier declaration_specifiers
			{
				PARSE_INFO("declaration_specifiers :type_qualifier declaration_specifiers")
				union_specifier_symbol( $1, $2 );
				del_symbol( $2 );
			}
		|	type_qualifier
			{
				PARSE_INFO("declaration_specifiers :type_qualifier")
			}
		;

storage_class_specifier
		:	kAUTO
			{
				PARSE_INFO("storage_class_specifier :kAUTO")
				$$ = new_symbol();
				$$->SCLASS = SPEC_AUTO;
			}
		|	kREGISTER
			{
				PARSE_INFO("storage_class_specifier :kREGISTER")
				$$ = new_symbol();
				$$->SCLASS = SPEC_REGISTER;
			}
		|	kSTATIC
			{
				PARSE_INFO("storage_class_specifier :kSTATIC")
				$$ = new_symbol();
				$$->IS_STATIC = 1;
			}
		|	kTYPEDEF
			{
				PARSE_INFO("storage_class_specifier :kTYPEDEF")
				$$ = new_symbol();
				$$->SCLASS = SPEC_TYPEDEF;
			}
		|	kEXTERN
			{
				PARSE_INFO("storage_class_specifier :kEXTERN")
				$$ = new_symbol();
				$$->IS_EXTERN = 1;
			}
		;

type_specifier
		:	kINT
			{
				PARSE_INFO("type_specifier :kINT")
				$$ = new_symbol();
				$$->NOUN = SPEC_INT;
			}
		|	kLONG
			{
				PARSE_INFO("type_specifier :kLONG")
				$$ = new_symbol();
				$$->NOUN = SPEC_INT;
				$$->IS_LONG = 1;
			}
		|	kSHORT
			{
				PARSE_INFO("type_specifier :kSHORT")
				$$ = new_symbol();
				$$->NOUN = SPEC_INT;
			}
		|	kCHAR
			{
				PARSE_INFO("type_specifier :kCHAR")
				$$ = new_symbol();
				$$->NOUN = SPEC_CHAR;
			}
		|	kVOID
			{
				PARSE_INFO("type_specifier :kVOID")
				$$ = new_symbol();
				$$->NOUN = SPEC_VOID;
			}
		|	kFLOAT
			{
				PARSE_INFO("type_specifier :kFLOAT")
				$$ = new_symbol();
				$$->NOUN = SPEC_FLOAT;
			}
		|	kDOUBLE
			{
				PARSE_INFO("type_specifier :kDOUBLE")
				$$ = new_symbol();
				$$->NOUN = SPEC_DOUBLE;
			}
		|	kSIGNED
			{
				PARSE_INFO("type_specifier :kSIGNED")
				$$ = new_symbol();
				$$->NOUN = SPEC_INT;
			}
		|	kUNSIGNED
			{
				PARSE_INFO("type_specifier :kUNSIGNED")
				$$ = new_symbol();
				$$->NOUN = SPEC_INT;
				$$->IS_UNSIGNED = 1;
			}
		|	idTYPEDEF
			{
				symbol	*tmp;

				PARSE_INFO("type_specifier :idTYPEDEF")
				tmp = find_symtab_typedef( $1 );
				assert( tmp );
				$$ = new_symbol_from_typedef( tmp );
				assert( $$ );
			}
		;
		
type_qualifier
		:	kCONST
			{
				PARSE_INFO("type_qualifier :kCONST")
				$$ = new_symbol();
				$$->SCLASS = SPEC_CONSTANT;
			}
		|	kVOLATILE
			{
				PARSE_INFO("type_qualifier :kVOLATILE")
				$$ = new_symbol();
				// ingore volatile attribute
			}
		;

init_declarator_list
		:	init_declarator
			{
				PARSE_INFO("init_declarator_list :init_declarator")
			}
		|	init_declarator_list oCOMMA init_declarator
			{
				PARSE_INFO("init_declarator_list :init_declarator_list oCOMMA init_declarator")
				link_symbol_list($1, $3);
			}
		;

init_declarator
		:	declarator
			{
				PARSE_INFO("init_declarator :declarator")
				// check array element
				// for globe or local var, the array element number could not be zero
				if ( IS_ARRAY($1) && !$1->num_ele )
				{
					yyerror("Array must be declarated with element number");
					user_exit(1);
				}
			}
		|	declarator oASSIGN initializer
			{
				PARSE_INFO("init_declarator :declarator oASSIGN initializer")
				if ( IS_FUNCTION($1) )
				{
					yyerror("initialization of a function");
					user_exit(1);
				}
				if ( !IS_CL($3) )
				{
					yyerror("initializer is not a constant");
					user_exit(1);
				}
				if ( IS_ARRAY($1) )
				{
					yyerror("array initialization unsupport");
					user_exit(1);
				}
				$1->args = $3;
				// set assign flag
				$1->is_assign = 1;
			}
		;

/*	// cast type 類型轉換, skip

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色图一区二区三区| 一区二区高清免费观看影视大全| 国产日韩精品一区二区三区| 亚洲精品老司机| 久久精品72免费观看| 色播五月激情综合网| 久久亚洲一区二区三区四区| 亚洲国产精品尤物yw在线观看| 国产精品乡下勾搭老头1| 666欧美在线视频| 亚洲视频1区2区| 成人av电影在线网| 精品国产亚洲在线| 青青草国产精品97视觉盛宴| 色播五月激情综合网| 国产精品国产自产拍高清av| 久久精品国产免费| 日韩一区二区三区免费观看| 亚洲观看高清完整版在线观看| 99久久久精品免费观看国产蜜| 欧美经典一区二区| 国产美女精品在线| 欧美电影免费观看高清完整版在| 丝袜国产日韩另类美女| 91精彩视频在线观看| 亚洲精选在线视频| 欧美在线短视频| 亚洲午夜电影在线| 欧美日韩一区二区三区在线 | 午夜精品123| 欧美综合一区二区三区| 樱花影视一区二区| 欧美午夜影院一区| 午夜精品国产更新| 欧美精品777| 毛片av一区二区| 久久久五月婷婷| 成人免费视频免费观看| 亚洲国产成人午夜在线一区| 成人免费av资源| **欧美大码日韩| 欧美三级一区二区| 亚洲成人自拍一区| 欧美一级电影网站| 精品一区二区三区久久| 国产亚洲欧美日韩俺去了| 成人一区在线观看| 亚洲精品中文字幕在线观看| 欧美性色综合网| 麻豆精品一区二区三区| 久久久影视传媒| 99在线视频精品| 三级影片在线观看欧美日韩一区二区| 日韩丝袜情趣美女图片| 国产凹凸在线观看一区二区| 亚洲免费毛片网站| 欧美一区在线视频| 国产福利精品一区| 亚洲福利电影网| 久久九九影视网| 色综合久久99| 日韩电影在线免费看| 亚洲精品在线电影| 91免费看视频| 免费日本视频一区| 亚洲欧洲日韩av| 日韩一级黄色片| 99v久久综合狠狠综合久久| 日韩 欧美一区二区三区| 久久精品人人爽人人爽| 欧美性极品少妇| 国产激情精品久久久第一区二区| 亚洲永久免费视频| 久久久99久久精品欧美| 欧美三级资源在线| 成人午夜免费电影| 强制捆绑调教一区二区| 日韩一区中文字幕| 久久婷婷成人综合色| 欧美自拍丝袜亚洲| 国产白丝网站精品污在线入口 | 国产精品人人做人人爽人人添 | 日韩国产在线一| 综合精品久久久| 欧美r级电影在线观看| 91啪在线观看| 国产大片一区二区| 久久超碰97人人做人人爱| 亚洲最大成人网4388xx| 国产精品色婷婷久久58| 日韩视频在线观看一区二区| 欧美熟乱第一页| 播五月开心婷婷综合| 国内外精品视频| 免费看黄色91| 奇米影视一区二区三区| 亚洲精品欧美在线| 亚洲日本一区二区三区| 国产亚洲欧美日韩俺去了| 日韩精品一区国产麻豆| 正在播放一区二区| 欧美中文字幕不卡| 色狠狠桃花综合| 91麻豆精东视频| av在线一区二区三区| 国产在线精品一区二区夜色| 毛片不卡一区二区| 麻豆成人免费电影| 日韩1区2区3区| 男人操女人的视频在线观看欧美| 亚洲欧美电影院| 亚洲欧美韩国综合色| 亚洲欧美日韩中文字幕一区二区三区| 国产精品伦理一区二区| 亚洲欧洲国产日韩| 国产精品激情偷乱一区二区∴| 久久女同精品一区二区| 久久这里只有精品6| 久久精品夜色噜噜亚洲aⅴ| 久久久久久日产精品| 国产欧美一区二区精品性色超碰 | 精品国偷自产国产一区| 91精品国产入口在线| 欧美一区在线视频| 久久综合色之久久综合| 国产偷国产偷亚洲高清人白洁| 欧美高清在线一区二区| 国产精品乱码人人做人人爱| 日韩理论在线观看| 亚洲影院理伦片| 卡一卡二国产精品| 国产成人亚洲综合a∨婷婷图片| 不卡av在线网| 欧美日韩成人综合在线一区二区| 69成人精品免费视频| 久久久影视传媒| 亚洲老司机在线| 乱一区二区av| 95精品视频在线| 91精品免费在线| 国产精品久久久久久久久免费樱桃| 亚洲精品久久久蜜桃| 日本中文字幕不卡| 岛国精品在线播放| 欧洲精品在线观看| 日韩欧美国产一区二区三区| 国产三级一区二区| 香蕉久久夜色精品国产使用方法 | 亚洲一区在线视频观看| 日本成人在线电影网| 东方欧美亚洲色图在线| 欧美在线观看一区二区| 欧美精品一区二区三区蜜桃| 亚洲三级电影全部在线观看高清| 丝袜美腿亚洲一区二区图片| 狠狠狠色丁香婷婷综合激情| 91片在线免费观看| 2017欧美狠狠色| 亚洲欧美一区二区三区极速播放| 蜜桃久久久久久| 91亚洲国产成人精品一区二区三 | 欧美午夜精品电影| 欧美精品一区二区三区久久久 | 欧美性视频一区二区三区| 日韩免费视频一区| 综合网在线视频| 国产精品资源在线| 91麻豆精品国产91| 亚洲欧美色图小说| 成人黄色免费短视频| 精品国产一区a| 视频精品一区二区| 日本韩国欧美在线| 日韩精品一级二级| 97se亚洲国产综合自在线| 精品欧美久久久| 秋霞电影一区二区| 欧美性一二三区| 亚洲精品日韩专区silk| 国产成人av一区二区三区在线 | 欧美色视频一区| 国产精品久久久久婷婷二区次| 日本亚洲免费观看| 欧美性受xxxx黑人xyx| 一区二区三区影院| 不卡的av中国片| 欧美经典一区二区| 欧美日韩一区二区欧美激情| 国产天堂亚洲国产碰碰| 狠狠色丁香婷婷综合| 91精品国产免费| 午夜激情一区二区三区| 欧美日韩国产综合一区二区| 亚洲精品成人天堂一二三| av高清久久久| 亚洲免费观看高清| 在线日韩国产精品| 午夜私人影院久久久久| 欧美色区777第一页| 亚洲成人www|