📄 c-.y
字号:
{$$=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 + -