📄 abnf.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 + -