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

📄 c-.y

📁 一个编译器的例子,基于c语言,在linux下开发 现在了简单的c语言例子
💻 Y
📖 第 1 页 / 共 3 页
字号:
	                           {$$=addSibling(addNext(newLeaf("exp"),$1),                                                                 addNext(newLeaf("asgnExp"),$3));}         ;constant_expression        : conditional_expression                      {$$=$1;}        ;declaration        : declaration_specifiers ';'                                {$$=$1;}        | declaration_specifiers init_declarator_list ';'      {$$=addSibling(addNext(newLeaf("decSpec"),$1),	                                                                                        addNext(newLeaf("iDecLst"),$2));                                                                                /*  funcType=0; 										  if(getsym(idName,scope)!=NULL){								                           yyerror(); yynerrs++;								                           printf("---error messege(%d,%d):token \"%s\" already defined before\n", 										                                                currLine, column, idName);								                  } else										           curIDNode->symTab=add2Table(idName,funcType,scope);										*/									 }        ;declaration_specifiers        : type_specifier                                               {$$=$1;}        | type_specifier declaration_specifiers                {$$=addSibling(addNext(newLeaf("typeSpec"),$1),	                                                                                                addNext(newLeaf("decSpec"),$2));  }        ;init_declarator_list        : init_declarator                                               {$$=addNext(newLeaf("iDector"),$1);curIDNode->symTab=add2Table(idName, funcType, scope);	                                                                    }        | init_declarator_list ',' init_declarator                  {$$=addSibling(addNext(newLeaf("iDecLst"),$1),	                                                                          addNext(newLeaf("iDector"),$3)); 										curIDNode->symTab=add2Table(idName, funcType, scope); 																			}          ;init_declarator        : declarator                                                   {$$=$1;}        | declarator '='  {arraySize=1;} initializer              	                                                         {$$=addSibling(addNext(newLeaf("ASSIGN"), 	                                                                                  addNext(newLeaf("dectr"),$1)), addNext(newLeaf("init"), $4));									  strcpy($$->value, "=");									  curIDNode->symTab=add2Table(idName,funcType,scope);									  							                  //strcpy(curIDNode->symTab->value,$4);									 if(curIDNode->symTab->isArray==1)    									        curIDNode->symTab->numArray=arraySize;								          else{									   float f;									   f=getConstant($4);									   //printf("str: %s\n", $4);									   //printf("f:%f\n",f);									   sprintf(curIDNode->symTab->value,"%f",f);									   //idType=-1;									   									   if(errorOccur()==2){								               yyerror(); yynerrs++;								               printf("---error messege(%d,%d):identifier  \"%s\" cannot be initialized by identifier(s)\n", 										                                                currLine, column, idName);									   } 									  }		}        ;type_specifier        :  CHAR                                       {idType=0; $$=newLeaf("char");}        | INT                                            {idType=1; $$=newLeaf("int");}        | FLOAT                                      {idType=2; $$=newLeaf("float");}	| VOID                                        {idType=3; $$=newLeaf("void");}        | DOUBLE                                    {idType=4; $$=newLeaf("double");}        | struct_specifier                            {idType=5; $$=$1;}        ;struct_specifier        : STRUCT ID '{'                {numMembers=0;					      if(getStruct($2, scope)!=NULL){							yyerror(); yynerrs++;							printf("---error messege(%d,%d):struct \"%s\" already defined before\n", 												currLine, column, idName);						} else{						   curStrNode=newStruct($2, scope);					   						   }			    			 } struct_declaration_list '}'         {	                                                                    $$=addSibling(newLeaf("struct"), addSibling(newLeaf("ID"),									                                addNext(newLeaf("strDecLst"), $5)));						                                curStrNode->numMembers = numMembers;										numMembers=-1;									}        | STRUCT '{'               {numMembers=0;	                                   char strtmp[256];					   sprintf(strtmp,"%d", numTypes);	                                  curStrNode=newStruct(strcat(strtmp, "-tmp"), scope);				   		           } struct_declaration_list '}'       			                                    {$$=addSibling(newLeaf("struct"), addNext(newLeaf("strDecLst"), $4));                                                                  curStrNode->numMembers = numMembers;							         numMembers=-1;							   }        | STRUCT ID                                        {$$=addSibling(newLeaf("struct"), newLeaf("ID"));								             if(getStruct($2, scope)==NULL){									          yyerror(); yynerrs++;								                  printf("---error messege(%d,%d):struct \"%s\" not defined\n", 										                                                currLine, column, $2);									     } else									        curStrNode=getStruct($2, scope);	                                                                         									 								  } 	//| STRUCT error ';'                                   {symRoot=NULL;printf("\nERROR\n");}      	;struct_declaration_list        : struct_declaration                          {$$=$1;}        | struct_declaration_list struct_declaration                 {$$=addSibling(addNext(newLeaf("strDecLst"),$1), addNext(newLeaf("strDec"), $2));}        ;struct_declaration        : specifier_qualifier_list struct_declarator_list ';'          {$$=addSibling(addNext(newLeaf("specQLst"),$1), addNext(newLeaf("strDectrLst"), $2));}        ;specifier_qualifier_list        : type_specifier specifier_qualifier_list                 {$$=addSibling(addNext(newLeaf("typeSpec"),$1), addNext(newLeaf("specQLst"), $2));}        | type_specifier                                               {$$=$1;}        ;struct_declarator_list        : declarator                                          {$$=$1;	                                                           strcpy(curStrNode->memberName[numMembers], idName);						                   curStrNode->member[numMembers]=idType;								   curStrNode->sizeOfMember[numMembers]=arraySize;								   arraySize=1;						                   numMembers++;}        | struct_declarator_list ',' declarator      {$$=addSibling(addNext(newLeaf("strDectrLst"),$1), addNext(newLeaf("dectr"), $3));	                                                                 strcpy(curStrNode->memberName[numMembers], idName);						                         curStrNode->member[numMembers]=idType;									 curStrNode->sizeOfMember[numMembers]=arraySize;									 arraySize=1;numMembers++;															     }        ;/*struct_declarator        : declarator                                               {$$=$1;}        | ':' constant_expression                                    | declarator ':' constant_expression        ;*/declarator        : '*' direct_declarator             {$$=addSibling(newLeaf("*"), addNext(newLeaf("dirDectr"), $2));}        | direct_declarator                 {$$=$1;}        ;direct_declarator        : ID                                    {strcpy(idName,$1);curIDNode=newLeaf("ID");$$ = curIDNode;}        | '(' declarator ')'                  {$$=$2;}        | direct_declarator '[' constant_expression ']'        	                                                     {$$=addSibling(addNext(newLeaf("dirDectr"), $1),addNext(newLeaf("constExp"), $3));							        if(getsym(idName,scope)!=NULL){								           yyerror(); yynerrs++;								           printf("---error messege(%d,%d):token \"%s\" already defined before\n", 										                                                currLine, column, idName);								  } else { 								            arraySize=getConstant($3); 									    if(numMembers==-1){											funcType=0;											curIDNode->symTab=add2Table(idName,funcType,scope);									   											curIDNode->symTab->isArray=1;																						//arraySize=getConstant($3);											//printf("\n array: %d\n",i);											curIDNode->symTab->numArray=arraySize;											if(errorOccur()!=0){												yyerror(); yynerrs++;												printf("---error messege(%d,%d):array  \"%s\" cannot be initialized\n", 																			currLine, column, idName);											}   										}									}							     }        | direct_declarator '[' ']'                     {$$= $1;   funcType=0; 								  if(getsym(idName,scope)!=NULL){								           yyerror(); yynerrs++;								           printf("---error messege(%d,%d):token \"%s\" already defined before\n", 										                                                currLine, column, idName);								  } else {								           curIDNode->symTab=add2Table(idName,funcType,scope);									   									   curIDNode->symTab->isArray=1;									   }								}        | direct_declarator '(' 	                                       { numArgs=0; strcpy(scope,"Global"); 					                /*   if(getsym(idName,scope)!=NULL){								           yyerror(); yynerrs++;								           printf("---error messege(%d,%d):token \"%s\" already defined before\n", 										                                                currLine, column, idName);								  } else {*/	                                                                $1->symTab=add2Table(idName,1,scope);																//	}							   strcpy(scope,idName);curFuncNode=curIDNode;}	                       parameter_list ')'                            			                 {$$=addSibling(addNext(newLeaf("dirDectr"),$1),  					                                addNext(newLeaf("paraLst"),$4));				                  $1->symTab->numArgs=numArgs;					}                       | direct_declarator '('  identifier_list ')'                                                      {$$=addSibling(addNext(newLeaf("dirDectr"),$1), addNext(newLeaf("idLst"),$3));}                               | direct_declarator '(' 	                                       {numArgs=0;strcpy(scope,"Global"); 					          if((strcmp(idName, "main")==0) && (getsym(idName,scope)!=NULL)){						          yyerror(); yynerrs++;							 printf("---==error messege(%d,%d):function \"%s\" already defined before\n", 										                                                currLine, column, idName);						   }else {	                                                     $1->symTab=add2Table(idName,1,scope);strcpy(scope,idName);					     							   }						  // }						}				   ')'                    {$$=$1;}       // | error ')'      {$$ = newLeaf("ERROR");yyerrok;}       // | error ']'      {$$ = newLeaf("ERROR");yyerrok;}        ;parameter_list        : parameter_declaration                   {$$=$1;}        | parameter_list ',' parameter_declaration          	                              {$$=addSibling(addNext(newLeaf("paraLst"),$1),                                                              addNext(newLeaf("paraDec"),$3));}        ;parameter_declaration        : declaration_specifiers declarator            {$$=addSibling(addNext(newLeaf("decSpec"),$1),                                                                                             addNext(newLeaf("dectr"),$2));									         curIDNode->symTab=add2Table(idName,funcType,scope);																		                 curFuncNode->symTab->argsType[numArgs]=idType;									         curIDNode->symTab->isFuncArg= 1;   									         curIDNode->symTab->argOrder=maxArgOrder(idName, curIDNode->symTab->scope);									         numArgs++;								 }            | declaration_specifiers abstract_declarator          {$$=addSibling(addNext(newLeaf("decSpec"),$1),                                                                                             addNext(newLeaf("absDectr"),$2));										curFuncNode->symTab->argsType[numArgs]=idType;										 numArgs++;										}          | declaration_specifiers                           {$$=$1;curFuncNode->symTab->argsType[numArgs]=idType;numArgs++;}        ;identifier_list        : ID                                                  {$$=newLeaf("ID");	                                                            if(($$->symTab=getsym($1,scope))==NULL){								         yyerror(); yynerrs++;								         printf("---error messege(%d,%d):token \"%s\" not defined, first use here\n", 										                                                currLine, column, $1);								     } 								 }        | identifier_list ',' ID                            {$$=addSibling(addNext(newLeaf("idLst"),$1), newLeaf("ID"));	                                                        if(($$->sibling->symTab=getsym($3,scope))==NULL){								         yyerror(); yynerrs++;								         printf("---error messege(%d,%d):token \"%s\" not defined, first use here\n", 										                                                currLine, column, $3);								     } 							       }        ;type_name        : specifier_qualifier_list                        {$$=$1;}        | specifier_qualifier_list abstract_declarator               {$$=addSibling(addNext(newLeaf("specQLst"),$1),                                                                                             addNext(newLeaf("absDectr"),$2));}            ;abstract_declarator        : '*'                                       {$$=newLeaf("*");}        | direct_abstract_declarator      {$$=$1;}        | '*' direct_abstract_declarator     {$$=addSibling(newLeaf("*"), addNext(newLeaf("dirAbsDectr"), $2));}        ;direct_abstract_declarator        : '(' abstract_declarator ')'               {$$=$2;}        | '[' ']'                                           {$$=NULL;}        | '[' constant_expression ']'              {$$= $2;}        | '(' ')'                                          {$$=NULL;}        | '(' parameter_list ')'                     {$$=$2;}

⌨️ 快捷键说明

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