2013-03-19 42 views
1

正如我在標題中所說的,我試圖用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);} 
     ; 
+0

請小心標記問題。 Flex標籤用於Adobe/Apache UI框架。 gnu-flex用於詞法分析器。 – JeffryHouser 2013-03-19 15:55:11

+0

感謝您幫助我使用正確的標籤! – Michael 2013-03-19 16:00:41

回答

1

也許我錯過了這裏的一些東西,但是您的語法只是說輸入應該是單個NUM和單個TYPE。就這樣。所以當分析器發現更多的東西時,你會在輸入的第二行發生錯誤。

您必須添加一條處理多行的規則。類似這樣的:

lots_of_partos: parto lots_of_partos | /* empty */ ; 
+0

謝謝你的回答。我認爲你是對的,因爲在輸出第一行之後,我得到了錯誤。所以我會試一試。 – Michael 2013-03-19 16:09:02

+0

@Micael:是的,你需要一個遞歸規則。我編輯了我的答案並添加了一個例子。 – 2013-03-19 16:12:01

+0

謝謝,托馬斯。我已經使用規則來使其工作。我在我的問題結尾給出規則。 – Michael 2013-03-19 20:11:48

相關問題