我正在尝试使用 flex 和 bison 编写解析器。但是,无论我如何修改文件,总是会出现错误“第 1 行中的语法错误”。这是 yyinput 的 test.vm 文件:
$asfdfsdf
sdfsdfs
sdfsdfsd
sdfsdfsd
sfsdfd
这是 vtl4.l 文件:
%{
#include<stdio.h>
#include<string.h>
#include "context.h"
#include "bool.h"
#include "vtl4.tab.h"
%}
%%
(.|\n)* {yylval.string = yytext;return CONTENT;}
<<EOF>> {return FINAL;}
%%
这是 vtl4.y 文件:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bool.h"
#include "parser.h"
#include "context.h"
#include "vtl4.tab.h"
extern FILE * yyin;
extern FILE * yyout;
extern int yylex();
extern int yywrap();
%}
%union {
struct simpleNode *ast;
double d;
int i;
bool b;
char* string;
struct symbol *sym;
}
%type <ast> root stmts stmt
%token <string> CONTENT
%token FINAL
%%
root:stmts FINAL {printf("root\n");$$ = process($1);traverse($$);}
;
stmts: {printf("stmts:stmt\n");$$ = 0;}
|stmts stmt {printf("stmts:stmts stmt\n");$$ = add_ybrother($1,$2);}
;
stmt:CONTENT {printf("stmt\n");$$ = text($1);}
;
%%
int main(){
FILE *src;
src = fopen("test.vm","r");
yyin = src;
yyparse();
fclose(src);
return 1;
}
int yywrap(){
return 1;
}
生成文件:
CC=cc
FLEX=vtl4.l
BISON=vtl4.y
parse:vtl4.tab.c lex.yy.c
$(CC) -o out *.c -ll
vtl4.tab.c:$(BISON)
bison -d $(BISON) --report=all
lex.yy.c:$(FLEX)
flex $(FLEX)
当我运行 ./out 时,它会打印正确的结果,但最后总是说“line:1: error: syntax error”!我不知道为什么?
当我编辑 lex 规则时效果很好
<<EOF>> {return FINAL;}
至
<<EOF>> {yyterminate();}
并修改yacc规则
root:stmts FINAL {printf("root\n");$$ = process($1);traverse($$);}
至
root:stmts {printf("root\n");$$ = process($1);traverse($$);}
但我不知道为什么?