亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
日韩免费看的电影| 亚洲人成在线观看一区二区| 国产精品久久久久久久久图文区| 蜜桃视频在线观看一区| 成人av电影观看| 欧美一级一区二区| 一区二区三区国产豹纹内裤在线| 久久91精品国产91久久小草| 色激情天天射综合网| 久久久久亚洲综合| 免费成人在线观看| 欧美在线色视频| 亚洲天堂免费在线观看视频| 国产成人精品一区二区三区四区 | 91黄色免费观看| 久久亚洲欧美国产精品乐播| 五月天婷婷综合| 欧美亚洲禁片免费| 亚洲激情中文1区| 91丝袜国产在线播放| 国产亚洲综合在线| 国产在线精品免费| 91精品国产欧美日韩| 午夜精品视频一区| 色婷婷精品久久二区二区蜜臀av| 国产精品三级av在线播放| 国产制服丝袜一区| 欧美电影免费观看高清完整版在线| 亚洲成人中文在线| 精品视频一区三区九区| 亚洲自拍偷拍综合| 在线欧美日韩国产| 亚洲已满18点击进入久久| 91成人在线精品| 亚洲成年人影院| 337p亚洲精品色噜噜| 日韩中文字幕区一区有砖一区 | 亚洲一区免费观看| 色视频成人在线观看免| 一区二区在线电影| 欧美亚洲综合色| 亚洲综合成人在线视频| 欧美丝袜第三区| 日韩av电影天堂| 精品国产精品一区二区夜夜嗨| 日本亚洲免费观看| 26uuu国产电影一区二区| 国产自产视频一区二区三区| 久久精品无码一区二区三区| 成人免费av网站| 亚洲激情av在线| 欧美一级高清片| 国产精品影视在线观看| 中文字幕一区二区三区av| 91久久精品一区二区| 日韩国产在线一| 国产亚洲综合在线| 欧美中文字幕一区二区三区亚洲| 亚洲高清免费观看高清完整版在线观看 | 欧美激情一区二区三区| 色天天综合久久久久综合片| 午夜精品免费在线| 久久久久久一级片| 在线免费av一区| 黄页视频在线91| 亚洲欧美一区二区三区孕妇| 欧美放荡的少妇| 成人午夜视频福利| 午夜在线电影亚洲一区| 欧美激情在线免费观看| 欧美日韩情趣电影| 成人手机电影网| 日韩高清不卡一区二区三区| 久久人人爽人人爽| 欧美日韩国产高清一区二区三区| 久久精品av麻豆的观看方式| 亚洲欧美日韩电影| www国产精品av| 欧美性大战久久久| 国产成人精品亚洲午夜麻豆| 爽爽淫人综合网网站| 国产精品久久久久国产精品日日| 91麻豆精品国产91久久久| 成人动漫中文字幕| 麻豆免费看一区二区三区| 一区二区三区 在线观看视频| xnxx国产精品| 在线电影欧美成精品| 91论坛在线播放| 国产99久久久久| 美日韩一区二区| 亚洲电影视频在线| 一区精品在线播放| 中文字幕第一区综合| 欧美一级欧美一级在线播放| 在线看不卡av| 色综合天天性综合| 国产91精品一区二区麻豆亚洲| 日韩精品一区第一页| 亚洲欧美日本韩国| 中文字幕一区二区三中文字幕| 欧美videos中文字幕| 欧美日韩黄色影视| 欧美在线免费观看视频| 色婷婷综合久久久中文一区二区| www.在线欧美| 成人黄色软件下载| 丁香啪啪综合成人亚洲小说 | 欧美tickling挠脚心丨vk| 欧美伊人久久久久久久久影院| 91麻豆高清视频| 91美女片黄在线| 在线观看免费亚洲| 欧美优质美女网站| 欧美亚一区二区| 欧美性大战久久久久久久蜜臀 | 亚洲男人电影天堂| www.日韩大片| 韩日av一区二区| 久草这里只有精品视频| 强制捆绑调教一区二区| 日韩电影网1区2区| 人人精品人人爱| 狠狠狠色丁香婷婷综合激情| 国产精品资源在线| 国产v综合v亚洲欧| 99综合影院在线| 91极品美女在线| 777午夜精品视频在线播放| 7777女厕盗摄久久久| 日韩欧美高清一区| 久久久国际精品| 综合在线观看色| 亚欧色一区w666天堂| 日本欧美一区二区三区乱码| 激情综合色丁香一区二区| 国产精品一区二区三区99 | 亚洲国产日韩综合久久精品| 亚洲一区成人在线| 日韩高清不卡一区二区| 国产曰批免费观看久久久| 99麻豆久久久国产精品免费| 欧洲视频一区二区| 日韩欧美自拍偷拍| 中文字幕一区二区三区视频| 亚洲一区二区在线视频| 久久91精品国产91久久小草| 99在线精品视频| 欧美乱熟臀69xxxxxx| 国产欧美一区视频| 亚洲一区二区三区四区的| 精品一区二区三区免费观看| www.日韩在线| 欧美一区二区三区啪啪| 中文字幕欧美三区| 日韩高清在线观看| 懂色av一区二区三区蜜臀| 欧美午夜一区二区三区免费大片| 日韩精品一区二区三区视频播放| 中文字幕亚洲成人| 麻豆91免费看| 日本韩国欧美一区| 久久久青草青青国产亚洲免观| 亚洲综合免费观看高清完整版在线| 免费不卡在线视频| 色综合久久久久综合体| 欧美大片一区二区三区| 亚洲自拍偷拍av| 国产精品一区在线| 91精品婷婷国产综合久久竹菊| 国产精品嫩草影院av蜜臀| 男人的天堂久久精品| 色婷婷综合久久久| 欧美高清在线精品一区| 久久爱www久久做| 欧美精品一级二级三级| 亚洲青青青在线视频| 成人免费视频一区| 26uuu色噜噜精品一区二区| 亚洲bt欧美bt精品| 日韩精品影音先锋| 亚洲电影在线播放| 99久久99久久精品免费看蜜桃| 久久久亚洲高清| 精品一区中文字幕| 91精品国产91久久综合桃花| 一区二区三区四区亚洲| 99久久国产综合精品麻豆| 久久亚洲精精品中文字幕早川悠里| 五月婷婷激情综合| 欧美色综合网站| 亚洲一区二区在线视频| 欧美做爰猛烈大尺度电影无法无天| 国产精品高潮呻吟| 成人禁用看黄a在线| 国产欧美视频一区二区| 国产精品中文有码| 国产欧美一区二区精品婷婷| 国产精品99久| 国产精品高清亚洲|