分析这个代码的各部分含义 %{ #include "yacc1.tab.h" %} %option noyywrap integer [0-9]+ dreal ([0-9]*"."[0-9]+) ereal ([0-9]*"."[0-9]+[EedD][+-]?[0-9]+) real {dreal}|{ereal} nl \n plus "+" minus "-" times "*" divide "/" lp "(" rp ")" module "%" power "^" sin1 "sin" cos1 "cos" tan1 "tan" log_ "log" log10_ "log10" %% [ \t] ; /*skip any blanks */ {integer} { sscanf(yytext, "%d", &yylval.integer); return INTEGER; } {real} { sscanf(yytext, "%lf", &yylval.real); /*yylval = atof(yytext); it doesn't work under MSVSC*/ return REAL; } {plus} { return PLUS;} {minus} { return MINUS;} {times} { return TIMES;} {divide} { return DIVIDE;} {module} { return MODULE;} {power} { return POWER;} {sin1} {return SIN;} {cos1} {return COS;} {tan1} {return TAN;} {log_} {return LOG;} {log10_} {return LOG10;} {lp} { return LP;} {rp} { return RP;} {nl} { return NL;} . { return yytext[0];}
时间: 2024-03-04 07:51:25 浏览: 128
这是一个 Lex 代码文件,用于将输入的字符串分割成一个个 token,以供后续的 Yacc 解析。具体含义如下:
- `%{ #include "yacc1.tab.h" %}`:在将 Lex 代码和 Yacc 代码编译成可执行程序之前,需要将 Lex 和 Yacc 共享的变量和函数声明放在一个头文件中,这里将该头文件包含进来。
- `%option noyywrap`:表示不使用默认的 yywrap 函数,该函数在 Lex 扫描完输入文件后会被调用,用于判断是否需要从另一个输入文件继续读取输入。
- `integer [0-9]+`:定义整数的正则表达式,表示由一位或多位数字组成。
- `dreal ([0-9]*"."[0-9]+)`:定义十进制实数的正则表达式,表示由零个或多个数字、一个小数点和一位或多位数字组成。
- `ereal ([0-9]*"."[0-9]+[EedD][+-]?[0-9]+)`:定义科学计数法表示的实数的正则表达式,表示由零个或多个数字、一个小数点、一个 E/e/D/d、一个可选的加号或减号和一位或多位数字组成。
- `real {dreal}|{ereal}`:定义实数的正则表达式,表示由十进制实数或科学计数法表示的实数组成。
- `nl \n`:定义换行符的正则表达式。
- `plus "+"`、`minus "-"`、`times "*"`、`divide "/"`、`module "%"`、`power "^"`:定义加、减、乘、除、取模和乘方运算符的正则表达式。
- `sin1 "sin"`、`cos1 "cos"`、`tan1 "tan"`、`log_ "log"`、`log10_ "log10"`:定义三角函数和对数函数的正则表达式。
- `%%`:表示 Lex 代码的开始。
- `[ \t] ;`:定义空格和制表符的正则表达式,表示跳过这些字符。
- `{integer}`、`{real}`、`{plus}`、`{minus}`、`{times}`、`{divide}`、`{module}`、`{power}`、`{sin1}`、`{cos1}`、`{tan1}`、`{log_}`、`{log10_}`、`{lp}`、`{rp}`、`{nl}`:定义正则表达式所对应的操作,即扫描到该字符串时的操作。
- `.`:表示除以上定义的 token 之外的任何字符。
- `{ return yytext[0];}`:表示返回当前扫描到的字符。
阅读全文