gpt4 book ai didi

c - flex bison,从文件读取时遇到标记后标记化停止

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:07 25 4
gpt4 key购买 nike

我是 flex 和 bison 的新手。我正在尝试编写一个接受字符串的简单语法:一个小写字母后跟一个大写字母。以下是我的文件-

文件.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

文件.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 token

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

弹性文件.l

yacc -d 文件.y

gcc lex.yy.c y.tab.c -o 文件

./文件

程序给出警告警告:赋值从指针生成整数而不进行强制转换 [-Wint-conversion]yylval=yytext;

当我运行程序(忽略警告)时,输出“发现较低”,即程序在 return LOWER 后停止读取标记。任何人都可以帮助并告诉我为什么会这样运行吗?还有为什么即使我在 file.y 中指定了 #define YYSTYPE char * 也会生成警告

最佳答案

1。为什么即使我在 file.y 中指定了 #define YYSTYPE char * 也会生成警告?

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

此外,您应该意识到简单地设置 yylval = yytext 永远是不正确的,因为 yytext 指向的缓冲区是私有(private)数据结构的一部分词汇扫描仪。如果需要将 token 的字符串值传递给解析器,则必须复制一份。

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

因为您实际上从未调用名称为 yyparse 的解析器。如果你正在使用标准的 bison 解析器,你不应该直接调用 yylexyylex 由解析器在需要 token 时调用。 [注1]

因为 yylex 只返回一个标记,调用它一次就会产生一个标记。您可以按照评论中的建议在循环中调用它,但这仍然不会解析文件。


注意事项

  1. Bison 可以生成“推送解析器”,当词法分析器有可用的标记时,它会被调用。在这种情况下,词法分析器操作不会返回,直到整个输入被解析,并且您将调用yylex 而不是yyparse。这可以简化某些语言的解析,但这里肯定不是这种情况。

关于c - flex bison,从文件读取时遇到标记后标记化停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com