【发布时间】:2014-05-17 10:20:57
【问题描述】:
我已经完成了我的 lex 文件并开始学习 yacc 但我对我的部分 lex 代码有一些疑问:
%{
#include "y.tab.h"
int num_lines = 1;
int comment_mode=0;
int stack =0;
%}
digit ([0-9])
integer ({digit}+)
float_num ({digit}+\.{digit}+)
%%
{integer} { //deal with integer
printf("#%d: NUM:",num_lines); ECHO;printf("\n");
yylval.Integer = atoi(yytext);
return INT;
}
{float_num} {// deal with float
printf("#%d: NUM:",num_lines);ECHO;printf("\n");
yylval.Float = atof(yytext);
return FLOAT;
}
\n { ++num_lines; }
. if(strcmp(yytext," "))ECHO;
%%
int yywrap() {
return 1;
}
每次我得到一个整数或浮点数时,我都会返回令牌并将其保存到 yylval 这是我在 parser.y 中的代码:
%{
#include <stdio.h>
#define YYDEBUG 1
void yyerror (char const *s) {
fprintf (stderr, "%s\n", s);
}
%}
%union{
int Integer;
float Float;
}
%token <int>INT;
%token <float>FLOAT;
%%
statement :
INT {printf("int yacc\n");}
| FLOAT {printf("float yacc\n");}
|
;
%%
int main(int argc, char** argv)
{
yyparse();
return 0;
}
由
编译
byacc –d parser.y
lex lex.l
gcc lex.yy.c y.tab.c –ll
因为我只是想尝试一些容易上手的东西,所以我想看看我是否可以解析 首先只有 int 和 float 数字,我在输入后将它们打印在 .l 和 .y 文件中 integer 或 float.int 开头 i 输入的第一个随机数,例如 123 ,然后我的程序打印:
1:数字:123
在 yylex() 和
"int yacc\n"
在 parser.y 中
但是如果我输入第二个 else 数字,它会显示语法错误并且程序关闭
我不知道问题出在哪里。
有什么解决办法吗?
【问题讨论】: