需要帮助来理解一小部分lex / flex hello world示例

时间:2014-02-20 08:06:58

标签: yacc lex flex-lexer

我是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。

1 个答案:

答案 0 :(得分:1)

括号表示“字符类”。括号内出现的任何字符都被视为匹配。这里我们有两个字符,空格和水平制表符(\t)。这些字符通常被称为“空白”。

裸分号表示“什么都不做。”

所以规则说,“无论何时你看到一个空格或一个标签(一个空白字符),什么都不做,然后得到下一个字符。”

由于词法分析器的输入可能有多个重复的空格字符,因此可以多次应用此词法分析器规则。作为简化,通常在字符类之后看到诸如+(1或更多)或*(零或更多)的量词。这条规则意味着,“每当你看到一个或多个空白字符时,什么也不做,然后得到下一个字符。”

[ \t]+ ;