yacc的syntax error错误

zhouxiaojian1985 2011-10-13 08:01:34
求教一下为什么第1个换行符\n处会出现syntax error的错误,想不明白,对yacc不是太熟悉。

lex.l

%{
#include "y.tab.h"
#include <math.h>

extern void *yyerror(char *msg);
%}

var [A-Za-z0-9]+
%%

AAA:{var} {
yylval.sval = yytext;
return KEYWORD;
}
BBB:{var} {
yylval.sval = yytext;
return KEYWORD;
}

[ \t] {
printf ( "whitespace\n" );
return WHITESPACE;
}
\n {
yylval.sval = yytext;
printf ( "newline\n" );
return NEWLINE;
}
. {
yylval.sval = yytext;
return ERROR;
}
%%
int yywrap()
{
return 1;
}


yacc.y
%{
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

extern FILE *yyin;
%}

%union {
int ival;
char *sval;
}

%token KEYWORD
%token WHITESPACE
%token NEWLINE
%token ERROR

%type <sval> KEYWORD
%type <sval> WHITESPACE
%type <sval> NEWLINE
%type <sval> ERROR

%%
statement_list: error
| statement '\n'
| statement_list statement '\n'
;

statement: KEYWORD { printf("%s\n", $1); }
| WHITESPACE { printf("WHITESPACE:%s\n", $1); }
| NEWLINE { printf("NEWLINE:%s\n", $1); }
| ERROR { yyerror($1); }
;

%%

int yyerror(char *msg)
{
printf("Error encountered: %s\n", msg);
}

int main()
{
yyin = fopen("test.txt", "r");
yyparse();
}


test.txt

AAA:aaaqwer
BBB:bbbasf


Makefile

YACC=yacc
LEX=lex
CC=gcc

main:y.tab.c lex.yy.c
$(CC) y.tab.c lex.yy.c -o main
y.tab.c:yacc.y
$(YACC) -d yacc.y
lex.yy.c:lex.l
$(LEX) lex.l


输出结果

AAA:aaaqwer
newline
Error encountered: syntax error
NEWLINE:

BBB:bbbasf
newline
NEWLINE:

...全文
1412 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mLee79 2011-10-14
  • 打赏
  • 举报
回复
你要么

\n {
yylval.sval = yytext;
printf ( "newline\n" );
return '\n';
}

要么

statement_list: error
| statement NEWLINE
| statement_list statement NEWLINE
;

赵4老师 2011-10-14
  • 打赏
  • 举报
回复
可能文件中实际换行为\r\n而不是\n
单步调试和设断点调试是程序员必须掌握的技能之一。
推荐使用WinHex软件查看文件原始字节内容。
zhouxiaojian1985 2011-10-14
  • 打赏
  • 举报
回复
怎么没人回答啊,自己顶一下!
zhouxiaojian1985 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhao4zhong1 的回复:]

可能文件中实际换行为\r\n而不是\n
单步调试和设断点调试是程序员必须掌握的技能之一。
推荐使用WinHex软件查看文件原始字节内容。
[/Quote]

我用的是Linux,应该不会有\r\n,
不过我接下来会去学习调试的,谢谢!
zhouxiaojian1985 2011-10-14
  • 打赏
  • 举报
回复
尝试了一下
把'\n'这个去掉就好了

statement_list: error
| statement
| statement_list statement
;

yacc的资料好少啊
实验目的: 通过阅读和改造PL/0编译程序,熟悉PL/0编译程序的整体架构,识别出各语法单位对应的子程序;掌握递归下降语法分析程序的设计思想,加深对递归下降语法分析程序的理解。 通过设计编制调试具体的YACC程序,掌握YACC源程序的基本组成。 实验内容: 1. 对PL/0编译程序进行裁减和改造,使其仅包含词法和语法分析过程。该分析程序读入PL/0语言的源程序,实现以下功能: (1)对于输入中形如/*......*/这样的注释内容需要过滤掉。 (2)如果发现词法或语法错误,输出相应的错误信息。 (3)对于输入的算法表达式(式中可以包括标识符和常量),如果合法,则输出该表达式的值。 (4)对算术表达式中的常量类型进行扩充,除了原有的整型,还可以支持浮点类型(选做)。 (5)如果输入是一个合法的语法成分 输出:输入正确,没有词法或语法错误; 输出:该语法成分对应的语法分析树。语法分析树的显示格式可自行设计,建议采用缩进的文本表示形式。(选做) 提示: (1)阅读相应语法程序时参考其对应的EBNF描述,如教材第3版表4.3。 (2)PL/0编译程序(包括主程序)是由18个嵌套及并列的子函数组成的,其中与表4.3中的语法规则直接对应的8个子函数为:block( )、constdeclaration( )、vardeclaration( )、statement( )、condition( )、expression( )、term( )、factor( )。 2.借助自动生成工具LEX和YACC完成以下实验内容 阅读并运行所给程序:词法.l、语法.y,以理解LEX和YACC的使用和二者之间的通信机制。(分别编译后生成:词法.c、语法.c,将两个文件在VC下创建到一个project下运行即可) 下面是程序运行后的输入和输出结果示例,其中输入“cat eat mouse”后,输出“Sentence is valid”,表示可以识别此类语句,而输入“I love you”后,输出“syntax error”,表示不可识别这类语句。 修改源程序(词法.l、语法.y),使得修改后的程序能够识别类似下列语法结构的语句: I love you. I like apples and pears. I wish you success. We study compiler hard. We study compiler hard in school. 也可以自己定义更多符合英语语法规则的句子。

24,857

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧