我創建了一個野牛/ 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;),並且它看起來正確。我不知道...這是我第一次這樣做.. –