我是初学者和野牛。我正在尝试编写一个接受字符串的简单语法:一个小写的单词后跟一个大写的单词。下面是我的文件 -
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 *
也会生成警告
答案 0 :(得分:2)
#define YYSTYPE char *
中指定了file.y
?因为该定义在file.l
中不可见。这两个文件必须具有yytext
的一致定义。
此外,您应该知道简单地设置yylval = yytext
永远不正确,因为yytext
指向的缓冲区是词法扫描程序的私有数据结构的一部分。如果您需要将令牌的字符串值传递给解析器,则必须复制。
main
没有读取整个文件?因为你实际上从未调用过名为yyparse
的解析器。如果您使用标准的野牛解析器,则不应直接调用yylex
;解析器在需要令牌时调用yylex
。 [注1]
由于yylex
只返回一个令牌,因此调用一次将产生一个令牌。您可以按照注释中的建议循环调用它,但仍然无法解析文件。
return
,您可以调用yylex
而不是yyparse
。这可以简化某些语言的解析,但肯定不是这种情况。