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

📄 calc_flex.l

📁 绘制一元函数曲线的工具 输入C语言语法的函数公式, 即可绘制函数的二维曲线 采用内置编译器和虚拟机(这是调整OK的版本)
💻 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 + -