我是lex / flex和yacc的初学者。我现在正在读一本书,它给出了lex / flex输入文件的hello world示例,以实现一个简单的计算器词法分析器。
代码在这里:
%{
#include <stdoio.h>
#include "y.tab.h"
int
yywrap(void)
{
return 1;
}
%}
%%
"+" return ADD;
"-" return SUB;
"*" return MUL;
"/" return DIV;
"\n" return CR;
([1-9][0-9]*)|0|([0-9]+\.[0-9]+) {
double temp;
sscanf(yytext,"%lf",&temp);
yylval.double_value=temp;
return DOUBLE_LITERAL;
}
[ \t] ;
.{
fprintf(stderr, "lexical error.\n");
exit(1);
}
%%
我不太清楚[ \t] ;
行在这里做了什么。有人能帮助我吗? THX。
答案 0 :(得分:1)
括号表示“字符类”。括号内出现的任何字符都被视为匹配。这里我们有两个字符,空格和水平制表符(\t
)。这些字符通常被称为“空白”。
裸分号表示“什么都不做。”
所以规则说,“无论何时你看到一个空格或一个标签(一个空白字符),什么都不做,然后得到下一个字符。”
由于词法分析器的输入可能有多个重复的空格字符,因此可以多次应用此词法分析器规则。作为简化,通常在字符类之后看到诸如+
(1或更多)或*
(零或更多)的量词。这条规则意味着,“每当你看到一个或多个空白字符时,什么也不做,然后得到下一个字符。”
[ \t]+ ;