我创建了一个野牛/ flex编译器,并且遇到了问题。我加了%glr-parser
但问题依然存在。我有:野牛意想不到的标记
有一个简单的例子,它代表我的问题
.Y文件:
%{
#include <stdio.h>
#include <stdlib.h>
extern FILE *yyin;
extern int yylex();
int line=1;
int error=0;
#define YYERROR_VERBOSE
void yyerror(const char *msg)
{
error = 1;
printf("ERROR in line %d : %s.\n", line, msg);
}
%}
%start programme
%token SP
%token CRLF
%token LETTER
%%
programme : id CRLF;
id : LETTER;
%%
int main(int argc, char *argv[])
{
if(argc == 2) yyin = fopen(argv[1], "r");
else if(argc < 2){
printf("No file found.\n");
return 0;
} else printf("Only one file is permitted.\n");
yyparse();
if(error == 0) printf("Finished at %d line.\nNo errors!\n",line);
return 0;
}
.L文件
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "myParser.h"
extern int line;
%}
%%
"\n" {line++; return CRLF;}
" " {return SP;}
[a-zA-Z] {return LETTER;}
%%
.h文件中
enum yytokentype {
SP = 259,
LETTER = 260,
CRLF = 261
}
我的程序得到一个。 txt文件:
file_correct.txt包含:A
在我的终端,我写的:
bison -d bison.y
flex myParser.l
gcc bison.tab.c lex.yy.c -lfl -o a
./a file_correct.txt
- >在第1行错误:语法错误,意想不到的$不确定的,期待的信。
输入A\n
应该是正确的。相反,我有这个信息。你能帮我吗?
您没有显示'rest_dec',这似乎是相关的。 (野牛报告解析冲突吗?为什么添加'%glr-parser'?如果没有冲突,GLR解析器不会改变任何东西。) – rici
您也不会显示您的flex描述,尽管您错误地标记了问题[tag:flex](flex scanner生成器的正确标签是[tag:flex-lexer];我修正了它)。当然,错误可能在您的扫描仪中。您是否确认了正确的令牌被扫描? – rici
对不起,我编辑了我的帖子:) 有2个移位/减少冲突,但我还在%gls-parser中添加了%expect 2,并没有发生任何事情。我相信它会读取正确的令牌......我为示例创建了一个手写分析树(例如int A;),并且它看起来正确。我不知道...这是我第一次这样做.. –