Я пытаюсь написать парсер с использованием flex и bison. Однако независимо от того, как я изменяю файлы, всегда появляется ошибка «синтаксическая ошибка в строке 1». Это test.vm файл yyinput:Как исправить «строка: 1: ошибка: синтаксическая ошибка!»
$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;
}
Makefile:
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)
когда я r un ./out, он напечатает правильный результат, но всегда говорит «строка: 1: ошибка: синтаксическая ошибка» наконец! Я не знаю почему?
Это хорошо работает, когда я редактирую ЛЕКС правило
<<EOF>> {return FINAL;}
в
<<EOF>> {yyterminate();}
и изменить правило YACC
root:stmts FINAL {printf("root\n");$$ = process($1);traverse($$);}
в
root:stmts {printf("root\n");$$ = process($1);traverse($$);}
но я не знаю почему?