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

📄 abnf.y

📁 mgcp协议源代码和测试程序,还有一个编译器
💻 Y
字号:
%{#include <stdio.h>#include <stdlib.h>#include <string.h>#include "compiler.h"#define YYERROR_VERBOSE#define YYDEBUG 1#define UPPER_REPEAT_LIMIT 655extern char *yytext;TRuleList gRuleList;TRule *pCurrentRule;TConcatenation *pCurrentConcatenation;TRepetition *pCurrentRepetition; TStack gStack;%}%union {  unsigned long dw;  char *sz;}%token <sz> RULE_NAME%token <sz> ELEMENT_NAME%token <sz> DIGIT%token <sz> HEXDIG%token <sz> QUOTED_STRING%token <dw> DEC_VAL%token <dw> HEX_VAL%%rulelist        :                 | rule  rulelist		        ;rule	    	: RULE_NAME '=' { pCurrentRule = AddNewRule(&gRuleList, ConvetName($1)); } elements 		        ;elements        : AddNewConcate concatenation                | AddNewConcate concatenation '/' elements {}                ;AddNewConcate   : { pCurrentConcatenation = AddNewConcatenation(pCurrentRule); }concatenation   : AddNewRep repetition                | AddNewRep repetition concatenation                ;AddNewRep       : { pCurrentRepetition = AddNewRepetition(pCurrentConcatenation); }repetition      : repeat element                ;                repeat          :       { pCurrentRepetition->iRepMin = pCurrentRepetition->iRepMax = 1; }                | DIGIT { pCurrentRepetition->iRepMin = pCurrentRepetition->iRepMax = atoi($1); }                | min '*' max		        ;min             : DIGIT { pCurrentRepetition->iRepMin = atoi($1); }                      | { pCurrentRepetition->iRepMin = 0; }                 ;max             : DIGIT { pCurrentRepetition->iRepMax = atoi($1);  }                 | { pCurrentRepetition->iRepMax = UPPER_REPEAT_LIMIT;}                ;element         : ELEMENT_NAME { pCurrentRepetition->iType = ELEMENT_RULE;                                  pCurrentRepetition->pName = Strdup(ConvetName($1));                                }                | '(' context_push elements context_pop ')' { pCurrentRepetition->iType = ELEMENT_GROUP; }                | '[' context_push elements context_pop ']' { pCurrentRepetition->iType = ELEMENT_OPTION; }                | QUOTED_STRING { pCurrentRepetition->iType = ELEMENT_STRING;                                   pCurrentRepetition->pName = malloc(strlen($1)-1);                                  memset(pCurrentRepetition->pName, 0, strlen($1)-1);                                  strncpy(pCurrentRepetition->pName, ($1)+1, strlen($1)-2);                                }                | DEC_VAL DIGIT           { pCurrentRepetition->iType = ELEMENT_CHAR;                                            pCurrentRepetition->iNumbValueStart                                              = pCurrentRepetition->iNumbValueEnd = strtol($2, NULL, 10);                                          }                | DEC_VAL DIGIT '-' DIGIT { pCurrentRepetition->iType = ELEMENT_CHAR;                                            pCurrentRepetition->iNumbValueStart = strtol($2, NULL, 10);                                            pCurrentRepetition->iNumbValueEnd = strtol($4, NULL, 10);                                          }                | HEX_VAL HEXDIG          { pCurrentRepetition->iType = ELEMENT_CHAR;                                            pCurrentRepetition->iNumbValueStart                                               = pCurrentRepetition->iNumbValueEnd = strtol($2, NULL, 16);                                          }                | HEX_VAL HEXDIG '-' HEXDIG { pCurrentRepetition->iType = ELEMENT_CHAR;                                              pCurrentRepetition->iNumbValueStart = strtol($2, NULL, 16);                                              pCurrentRepetition->iNumbValueEnd = strtol($4, NULL, 16);                                            }                ;context_push    : { PushStack(&gStack,pCurrentRepetition);    		        PushStack(&gStack,pCurrentConcatenation);		            PushStack(&gStack,pCurrentRule);   		            pCurrentRule = &pCurrentRepetition->GroupOption.Rule;  		          }                ;context_pop     : { pCurrentRule = PopStack(&gStack);                    pCurrentConcatenation = PopStack(&gStack);                    pCurrentRepetition = PopStack(&gStack);                  }                ;%%extern FILE *yyin, *yyout;char* ConvetName(char *Str){	int i = strlen(Str) - 1;	while (i--)	{		if (*(Str+i) == '-')		{			*(Str+i) = '_';		}	}	return Str;}int yyerror(char *s){	printf("yyerror: %s, %s\n", s, yytext);	return 0;}int main(int argc, char **argv){	FILE *HeaderFile, *FuncDefFile;		yydebug = 8;		InitRuleList(&gRuleList);	InitStack(&gStack);	if (argc > 1)	{		HeaderFile = fopen(argv[1], "w");	}	else	{		HeaderFile = stdout;	}	if (argc > 2)	{		FuncDefFile = fopen(argv[2], "w");	}	else	{		FuncDefFile = stdout;	}	if (argc > 3)	{		yyin = fopen (argv[3], "r");	}	printf("\r\n\t init ok \r\n");	yyparse();		printf("\r\n\t yyparse() ok \r\n");		fprintf(HeaderFile, "#ifndef __ABNF_H__\r\n#define __ABNF_H__\r\n\r\n");  	fprintf(HeaderFile, "#include \"parser.h\"\r\n\r\n");	fprintf(FuncDefFile, "/* This file is generated by abnf compiler\r\n");	fprintf(FuncDefFile, " * Data   : %s %s \r\n */\r\n\r\n", __TIME__, __DATE__);		fprintf(FuncDefFile, "#include <stdio.h>\r\n");	fprintf(FuncDefFile, "#include <stdlib.h>\r\n");	fprintf(FuncDefFile, "#include <string.h>\r\n\r\n");		fprintf(FuncDefFile, "#include \"parser.h\"\r\n");	fprintf(FuncDefFile, "#include \"typedef.h\"\r\n");	fprintf(FuncDefFile, "#include \"debg.h\"\r\n");	fprintf(FuncDefFile, "#include \"abnf.h\"\r\n\r\n");	printf("\r\n*****************************************\r\nProcess RuleList...\r\n");	printf("PrintHeaderFile...\r\n");	printf("PrintFuncDefFile...\r\n");	PrintCFile(&gRuleList, HeaderFile, FuncDefFile);	printf("\r\nFreeRuleList...\r\n");	FreeRuleList(&gRuleList);	printf("\r\n*****************************************\r\n\r\n");	fprintf(HeaderFile, "\r\n\r\n#endif\r\n\r\n");	fprintf(FuncDefFile, "\r\n\r\n");	fclose(HeaderFile);	fclose(FuncDefFile);	return 0;}

⌨️ 快捷键说明

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