正如我在標題中所說的,我試圖用flex和bison編寫解析器。但是,無論如何修改文件,總是會出現錯誤「第1行中的語法錯誤」。flex/bison總是在第一行出現「語法錯誤」
所以我決定寫一個非常簡單的例子來看我的方法是否正確。
這是一個簡單的文件 「c1.isc」,這將是閱讀:
1 nand
2 nor
3 nand
4 nor
5 xor
這是token.l文件:
%{
# include <stdio.h>
# include <string.h>
# include "parse.tab.h"
struct{
char *symbol;
int val;
} symtab[]={
"nand", 1,
"nor", 2,
"xor", 3,
"0",0
};
extern int yylval;
%}
DIGITS [0-9]+
BLANK [ \t\n]+
ALPHA [a-z]+
%%
{DIGITS} {yylval=atoi(yytext);return(NUM);}
{ALPHA} {yylval=lookup(yytext);return(TYPE);}
{BLANK} ;
%%
lookup(s)
char* s;
{int i;
for (i=0;symtab[i].val!=0;i++)
{
if(strcmp(symtab[i].symbol,s)==0)
break;
}
return(symtab[i].val);
}
這是parse.y文件
%{
# include <stdio.h>
extern FILE *yyin;
int gi;
%}
%token NUM TYPE
%%
parto: NUM
{gi=$1;printf("num=%d\t",gi);}
TYPE
{gi=$3;printf("type=%d\n",gi);}
;
%%
yyerror(s)
char *s;
{
extern int yylineno;
extern char yytext[];
fprintf(stderr, "%s in line %d near <%s>\n", s, yylineno, yytext);
exit(-1);
}
main()
{FILE *x=fopen("c1.isc","r");
yyin=x;
yyparse();
}
我認爲這幾乎是最簡單的例子,但解析器只輸出第一行爲「num = 1 gat = 1」,然後是「synt」 ax 1線附近的錯誤「。
我真的不知道爲什麼。我確定令牌文件是正確的,因爲我已經使用以下方式對它進行了測試:
%{
# include <stdio.h>
# include <string.h>
struct{
char *symbol;
int val;
} symtab[]={
"nand", 1,
"nor", 2,
"xor", 3,
"0",0
};
int val;
%}
DIGITS [0-9]+
BLANK [ \t\n]+
ALPHA [a-z]+
%%
{DIGITS} {val=atoi(yytext);printf("num=%d\t",val);}
{ALPHA} {val=lookup(yytext);printf("type=%d\n",val);}
{BLANK} ;
%%
lookup(s)
char* s;
{int i;
for (i=0;symtab[i].val!=0;i++)
{
if(strcmp(symtab[i].symbol,s)==0)
break;
}
return(symtab[i].val);
}
main()
{
FILE *x=fopen("c1.isc","r");
yyin=x;
yylex();
}
yylex()可以工作。
我編譯的方法是 1.柔性token.l 2.野牛-d parse.y 3立方厘米的lex.yy.c parse.tab.c -lfl
然後,我會得到a.out
當我運行a.out
時,出現錯誤。
我想這是因爲我在parse.y文件中的規則不正確,但是錯誤總是出現在第一行?
我已經使用以下規則使其工作。
parti:
| parti parto
;
parto: NUM
{gi=$1;printf("num=%d\t",gi);}
TYPE
{gi=$3;printf("type=%d\n",gi);}
;
請小心標記問題。 Flex標籤用於Adobe/Apache UI框架。 gnu-flex用於詞法分析器。 – JeffryHouser 2013-03-19 15:55:11
感謝您幫助我使用正確的標籤! – Michael 2013-03-19 16:00:41