📄 calc_flex.l
字号:
%{#ifndef YY_NO_UNISTD_H#define YY_NO_UNISTD_H#endif/*YY_NO_UNISTD_H*/#include "ucvm_type.h"#include "calc_yacc.h"void skip_comment(void);void skip_spaceSS(void);void save_tokenID(const char *);void save_tokenCS(const char *);void save_tokenCC(const char *);void save_tokenCI(const char *);void save_tokenCH(const char *);void save_tokenCF(const char *);void save_tokenOP(const char *);void save_tokenAS(short);long my_strTOint(const char *);long my_hexTOint(const char *);Real my_strTOdbl(const char *);%}%%"/*" { skip_comment(); }"if" { save_tokenOP(yytext); return(IF); }"else" { save_tokenOP(yytext); return(ELSE); }"goto" { save_tokenOP(yytext); return(GOTO); }"do" { save_tokenOP(yytext); return(DO); }"for" { save_tokenOP(yytext); return(FOR); }"while" { save_tokenOP(yytext); return(WHILE); }"break" { save_tokenOP(yytext); return(BREAK); }"continue" { save_tokenOP(yytext); return(CONTI); }[a-zA-Z_][a-zA-Z_0-9]* { save_tokenID(yytext); return(IDENTIFIER); }\"(\\.|[^\\"])*\" { save_tokenCS(yytext); return(CONSTANT_S); }'(\\.|[^\\'])+' { save_tokenCC(yytext); return(CONSTANT_C); }0[xX][a-fA-F0-9]+ { save_tokenCH(yytext); return(CONSTANT_I); }[0-9]+ { save_tokenCI(yytext); return(CONSTANT_I); }[0-9]+[Ee][+-]?[0-9]+ { save_tokenCF(yytext); return(CONSTANT_R); }[0-9]*"."[0-9]+([Ee][+-]?[0-9]+)? { save_tokenCF(yytext); return(CONSTANT_R); }[0-9]+"."[0-9]*([Ee][+-]?[0-9]+)? { save_tokenCF(yytext); return(CONSTANT_R); }"+=" { save_tokenAS(ASSADD); return(ASS); }"-=" { save_tokenAS(ASSSUB); return(ASS); }"*=" { save_tokenAS(ASSMUL); return(ASS); }"/=" { save_tokenAS(ASSDIV); return(ASS); }"%=" { save_tokenAS(ASSBAL); return(ASS); }"&=" { save_tokenAS(ASSAND); return(ASS); }"^=" { save_tokenAS(ASSXOR); return(ASS); }"|=" { save_tokenAS(ASSOOR); return(ASS); }"<<=" { save_tokenAS(ASSSHL); return(ASS); }">>=" { save_tokenAS(ASSSHR); return(ASS); }"&&" { save_tokenOP(yytext); return(AND); }"||" { save_tokenOP(yytext); return(OOR); }"==" { save_tokenOP(yytext); return(CEQ); }"!=" { save_tokenOP(yytext); return(CNE); }">=" { save_tokenOP(yytext); return(CGE); }"<=" { save_tokenOP(yytext); return(CLE); }"<<" { save_tokenOP(yytext); return(SHL); }">>" { save_tokenOP(yytext); return(SHR); }"++" { save_tokenOP(yytext); return(INC); }"--" { save_tokenOP(yytext); return(DEC); }"+" { save_tokenOP(yytext); return('+'); }"-" { save_tokenOP(yytext); return('-'); }"*" { save_tokenOP(yytext); return('*'); }"/" { save_tokenOP(yytext); return('/'); }"%" { save_tokenOP(yytext); return('%'); }"&" { save_tokenOP(yytext); return('&'); }"^" { save_tokenOP(yytext); return('^'); }"|" { save_tokenOP(yytext); return('|'); }"!" { save_tokenOP(yytext); return('!'); }"~" { save_tokenOP(yytext); return('~'); }"(" { save_tokenOP(yytext); return('('); }")" { save_tokenOP(yytext); return(')'); }"[" { save_tokenOP(yytext); return('['); }"]" { save_tokenOP(yytext); return(']'); }"{" { save_tokenOP(yytext); return('{'); }"}" { save_tokenOP(yytext); return('}'); }">" { save_tokenOP(yytext); return('>'); }"<" { save_tokenOP(yytext); return('<'); }"," { save_tokenOP(yytext); return(','); }";" { save_tokenOP(yytext); return(';'); }"." { save_tokenOP(yytext); return('.'); }"=" { save_tokenAS(ASSIGN); return(ASS); }":" { save_tokenOP(yytext); return(':'); }[ \t\v\n\f] { skip_spaceSS(); }%%yywrap(){ return(1);}#ifdef __cplusplusvoid skip_comment(void){ char c, c1;loop: while ((c = yyinput()) != '*' && c != 0) /*putchar(c)*/; if ((c1 = yyinput()) != '/' && c != 0) { unput(c1); goto loop; } if (c != 0) { /*putchar(c)*/; }}#else /*__cplusplus*/void skip_comment(void){ char c, c1;loop: while ((c = input()) != '*' && c != 0) /*putchar(c)*/; if ((c1 = input()) != '/' && c != 0) { unput(c1); goto loop; } if (c != 0) { /*putchar(c1)*/; }}#endif /*__cplusplus*/void skip_spaceSS(void){ /* fprintf(yyout, "space: [%d]\n", *yytext); */}void save_tokenID(const char *s){ yylval.s_value = strdup(s);#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenID:[%s]\n", yylval.s_value);#endif/*DEBUG_PRINT_TOKEN*/}void save_tokenCS(const char *s){ yylval.s_value = strdup(s);#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenCS:[%s]\n", yylval.s_value);#endif/*DEBUG_PRINT_TOKEN*/}void save_tokenCC(const char *s){ yylval.c_value = *s;#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenCC:[%c]\n", yylval.c_value);#endif/*DEBUG_PRINT_TOKEN*/}void save_tokenCI(const char *s){ yylval.i_value = my_strTOint(s);#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenCI:[%d]\n", yylval.i_value);#endif/*DEBUG_PRINT_TOKEN*/}void save_tokenCH(const char *s){ yylval.i_value = my_hexTOint(s);#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenCH:[%d]\n", yylval.i_value);#endif/*DEBUG_PRINT_TOKEN*/}void save_tokenCF(const char *s){ yylval.r_value = my_strTOdbl(s);#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenCF:[%f]\n", yylval.r_value);#endif/*DEBUG_PRINT_TOKEN*/}void save_tokenOP(const char *s){#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenOP:[%s]\n", s);#endif/*DEBUG_PRINT_TOKEN*/}void save_tokenAS(short i){ yylval.i_value = i;#ifdef DEBUG_PRINT_TOKEN fprintf(yyout, "tokenAS:[%d]\n", i);#endif/*DEBUG_PRINT_TOKEN*/}long my_strTOint(const char *s){ long result = 0; while(*s) { result = (result << 1) + (result << 3) + (*s - '0'); s ++; }; return(result);}long my_hexTOint(const char *s){ long result = 0; s += 2; while(*s) { if(*s <= '9') result = (result << 4) | (*s - '0'); else if(*s <= 'F') result = (result << 4) | (*s - 'A'); else result = (result << 4) | (*s - 'a'); s ++; };}Real my_strTOdbl(const char *s){ long p = 0; Real r = 0; while(*s) { if(*s >= '0' && *s <= '9') { r = r * 10 +(*s - '0'); s ++ ; } else break; } if(*s == '.') { s ++ ; while(*s) { if(*s >= '0' && *s <= '9') { r = r * 10 +(*s - '0'); p -- ; s ++ ; } else break; }; } if(*s == 'e' || *s == 'E') { s ++ ; if(*s == '-') { p += (0 - my_strTOint(++ s)); } else if(*s == '+') { p += (0 + my_strTOint(++ s)); } else { p += my_strTOint(s); } } return(pow(10.0, p)* r);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -