📄 string2.lex
字号:
/* * string2.lex: An example of using scanning strings * by using start states. */%{#include <ctype.h>#include <malloc.h>#define isodigit(x) ((x) >= '0' && (x) <= '7') #define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10) char *buffer = NULL;int buffer_size = 0;void yyerror(char *message){ printf("\nError: %s\n",message);}%}%x STRINGhex (x|X)[0-9a-fA-F]{1,2}oct [0-7]{1,3}%%\" { buffer = malloc(1); buffer_size = 1; strcpy(buffer,""); BEGIN(STRING); }<STRING>\n { yyerror("Unterminated string"); free(buffer); BEGIN(INITIAL); }<STRING><<EOF>> { yyerror("EOF in string"); free(buffer); BEGIN(INITIAL); }<STRING>[^\\\n"] { buffer = realloc(buffer,buffer_size+yyleng+1); buffer_size += yyleng; strcat(buffer,yytext); }<STRING>\\\n /* ignore this */<STRING>\\{hex} { int temp =0,loop = 0; for(loop=yyleng-2; loop>0; loop--){ temp <<= 4; temp += hextoint(toupper(yytext[yyleng-loop])); } buffer = realloc(buffer,buffer_size+1); buffer[buffer_size-1] = temp; buffer[buffer_size] = '\0'; buffer_size += 1; }<STRING>\\{oct} { int temp =0,loop = 0; for(loop=yyleng-1; loop>0; loop--){ temp <<= 3; temp += (yytext[yyleng-loop] - '0'); } buffer = realloc(buffer,buffer_size+1); buffer[buffer_size-1] = temp; buffer[buffer_size] = '\0'; buffer_size += 1; }<STRING>\\[^\n] { buffer = realloc(buffer,buffer_size+1); switch(yytext[yyleng-1]){ case 'b' : buffer[buffer_size-1] = '\b'; break; case 't' : buffer[buffer_size-1] = '\t'; break; case 'n' : buffer[buffer_size-1] = '\n'; break; case 'v' : buffer[buffer_size-1] = '\v'; break; case 'f' : buffer[buffer_size-1] = '\f'; break; case 'r' : buffer[buffer_size-1] = '\r'; break; default : buffer[buffer_size-1] = yytext[yyleng-1]; } buffer[buffer_size] = '\0'; buffer_size += 1; }<STRING>\" { printf("string = \"%s\"",buffer); free(buffer); BEGIN(INITIAL); }%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -