flex bison,在从文件读取时遇到令牌后,令牌化停止

时间:2017-02-05 15:37:24

标签: c bison flex-lexer

我是初学者和野牛。我正在尝试编写一个接受字符串的简单语法:一个小写的单词后跟一个大写的单词。下面是我的文件 -

file.l

%{
#include<stdio.h>
#include<string.h>
#include "y.tab.h"

int yywrap(void)
{
    printf("parsing is done*\n");   
    //yylex();
    //return 0;
}
%}

%%
[a-z]* { printf("found lower\n");
    yylval=yytext;
    return LOWER;
}
[A-Z]* { printf("found upper\n");
    yylval=yytext;
    return UPPER;
}

[ \n] ;
. ;
%%
void main()
{


        yyin = fopen("file.txt", "r");
        yylex();//this function will start the rules section.... it starts the parsing.....
        fclose(yyin);

}//main ends

file.y

%{
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define YYSTYPE char *
int yylex(void);
void yyerror(const char *str)
{
        fprintf(stderr,"error: %s\n",str);
}
%}

%token LOWER UPPER

%%
start   :
    |
    start LOWER UPPER
    {
        printf("%s--%s\n",$2,$3);

    }
%%

file.txt的内容是:

令牌TOKEN

这是我编译和运行的方式:

flex file.l

yacc -d file.y

gcc lex.yy.c y.tab.c -o file

./文件

该程序发出警告 警告:赋值在没有强制转换的情况下从指针生成整数[-Wint-conversion] 的yylval = yytext中;

当我运行程序(忽略警告)时,输出为&#34;低于&#34;即程序在return LOWER之后停止读取令牌。任何人都可以帮助并告诉我为什么这样运行?为什么即使我在file.y中指定#define YYSTYPE char *也会生成警告

1 个答案:

答案 0 :(得分:2)

1。即使我在#define YYSTYPE char *中指定了file.y

,为什么会生成警告

因为该定义在file.l中不可见。这两个文件必须具有yytext的一致定义。

此外,您应该知道简单地设置yylval = yytext永远不正确,因为yytext指向的缓冲区是词法扫描程序的私有数据结构的一部分。如果您需要将令牌的字符串值传递给解析器,则必须复制。

2。为什么main没有读取整个文件?

因为你实际上从未调用过名为yyparse的解析器。如果您使用标准的野牛解析器,则不应直接调用yylex;解析器在需要令牌时调用yylex。 [注1]

由于yylex只返回一个令牌,因此调用一次将产生一个令牌。您可以按照注释中的建议循环调用它,但仍然无法解析文件。

注释

  1. Bison可以生成&#34;推送解析器&#34;当词法分析器具有可用令牌时由词法分析器调用。在这种情况下,在解析整个输入之前,词法分析器操作不会return,您可以调用yylex而不是yyparse。这可以简化某些语言的解析,但肯定不是这种情况。