执行使用lex和yacc工具开发的c文件时出错
我正在尝试使用lex和yacc设计一个迷你c编译器,所以当我使用输入c文件编译它时,它显示c文件中有语法错误,即使c文件没有任何错误 LEX文件(c.l) 输出为:执行使用lex和yacc工具开发的c文件时出错,c,compiler-construction,yacc,lex,C,Compiler Construction,Yacc,Lex,我正在尝试使用lex和yacc设计一个迷你c编译器,所以当我使用输入c文件编译它时,它显示c文件中有语法错误,即使c文件没有任何错误 LEX文件(c.l) 输出为: 8 : syntax error " Parsing complete 那么问题是为什么这个问题会出现在代码中?对代码进行任何更改以使其正常工作。我不知道问题发生在哪里,所以我发布了整个lex和yacc代码…任何建议都会很有帮助。提前感谢。您的lex模式对于#include需要一个尾随空格,您可以这样做
8 : syntax error "
Parsing complete
那么问题是为什么这个问题会出现在代码中?对代码进行任何更改以使其正常工作。我不知道问题发生在哪里,所以我发布了整个lex和yacc代码…任何建议都会很有帮助。提前感谢。您的lex模式对于
#include
需要一个尾随空格,您可以这样做在您的C源文件中没有。那么我应该在哪里修改代码,使其能够顺利运行???如果您提出建议,将对我更有帮助…感谢您修复您试图解析的C示例代码(添加缺少的空格字符)或者允许#在您的lex模式中包含,但不包含尾随空格。对不起,SO的目的不是引导那些毫无线索的人,而是让人们能够自助。这就是我试过的。如果您自己编写这段代码(或者至少阅读它以了解它应该如何工作),您很可能知道我在说什么。既然你没有,恐怕我得假设你只是在抄袭别人的作业,试图把它修好。我拒绝。嘿,谢谢..我听到了你说的话,我成功地修复了它…很抱歉给你造成了不一致…但是我在修复了前一个错误后遇到了另一个错误..这个错误类似于8:syntax error“Parsing error.这个错误和前一个类似吗?你确定[\n]{line++;}
哪一行增加了空格?我肯定是这样的……你想让我重新考虑这一行吗???
%{
#include <stdio.h>
#include <stdlib.h>
extern FILE *fp;
%}
%token INT FLOAT CHAR DOUBLE VOID
%token FOR WHILE
%token IF ELSE PRINTF
%token STRUCT
%token NUM ID
%token INCLUDE
%token DOT
%right '='
%left AND OR
%left '<' '>' LE GE EQ NE LT GT
%%
start: Function
| Declaration
;
/* Declaration block */
Declaration: Type Assignment ';'
| Assignment ';'
| FunctionCall ';'
| ArrayUsage ';'
| Type ArrayUsage ';'
| StructStmt ';'
| error
;
/* Assignment block */
Assignment: ID '=' Assignment
| ID '=' FunctionCall
| ID '=' ArrayUsage
| ArrayUsage '=' Assignment
| ID ',' Assignment
| NUM ',' Assignment
| ID '+' Assignment
| ID '-' Assignment
| ID '*' Assignment
| ID '/' Assignment
| NUM '+' Assignment
| NUM '-' Assignment
| NUM '*' Assignment
| NUM '/' Assignment
| '\'' Assignment '\''
| '(' Assignment ')'
| '-' '(' Assignment ')'
| '-' NUM
| '-' ID
| NUM
| ID
;
/* Function Call Block */
FunctionCall : ID'('')'
| ID'('Assignment')'
;
/* Array Usage */
ArrayUsage : ID'['Assignment']'
;
/* Function block */
Function: Type ID '(' ArgListOpt ')' CompoundStmt
;
ArgListOpt: ArgList
|
;
ArgList: ArgList ',' Arg
| Arg
;
Arg: Type ID
;
CompoundStmt: '{' StmtList '}'
;
StmtList: StmtList Stmt
|
;
Stmt: WhileStmt
| Declaration
| ForStmt
| IfStmt
| PrintFunc
| ';'
;
/* Type Identifier block */
Type: INT
| FLOAT
| CHAR
| DOUBLE
| VOID
;
/* Loop Blocks */
WhileStmt: WHILE '(' Expr ')' Stmt
| WHILE '(' Expr ')' CompoundStmt
;
/* For Block */
ForStmt: FOR '(' Expr ';' Expr ';' Expr ')' Stmt
| FOR '(' Expr ';' Expr ';' Expr ')' CompoundStmt
| FOR '(' Expr ')' Stmt
| FOR '(' Expr ')' CompoundStmt
;
/* IfStmt Block */
IfStmt : IF '(' Expr ')'
Stmt
;
/* Struct Statement */
StructStmt : STRUCT ID '{' Type Assignment '}'
;
/* Print Function */
PrintFunc : PRINTF '(' Expr ')' ';'
;
/*Expression Block*/
Expr:
| Expr LE Expr
| Expr GE Expr
| Expr NE Expr
| Expr EQ Expr
| Expr GT Expr
| Expr LT Expr
| Assignment
| ArrayUsage
;
%%
int count=0;
#include"lex.yy.c"
#include<ctype.h>
int main(int argc, char *argv[])
{
yyin=fopen(argv[1], "r");
if(!yyparse())
printf("\nParsing complete\n");
else
printf("\nParsing failed\n");
fclose(yyin);
return 0;
}
yyerror(char *s) {
printf("%d : %s %s\n", line, s, yytext );
}
#include <stdio.h>
int main()
{
int c;
int a=10;
int b=10;
c=a+b;
printf("the value of c is %d",c);
return 0;
}
$ lex c.l
$ yacc c.y
$ gcc y.tab.c -ll -ly
$ ./a.out add.c
8 : syntax error "
Parsing complete