2014-03-28 185 views
0

我正在學習John R. Levine的書中的flex和bison。我想讀一個'SELECT'聲明(這是我的代碼讀取的文件的內容),但我收到'flex scanner jammed'。代碼有什麼問題?Flex-bison簡單例子

詞法分析器:pmysql.l

%option noyywrap nodefault yylineno case-insensitive 
%{ 
#include "pmysql.tab.h" 
#include <stdarg.h> 
#include <string.h> 

void yyerror(char *s, ...); 

%} 

%% 

"SELECT" { return SELECT; } 
[-+&~|^/%*(),.;!] { return yytext[0]; } 

%% 

詞法分析器:pmysql.y

%{ 
#include <stdlib.h> 
#include <stdarg.h> 
#include <string.h> 
void yyerror(char *s, ...); 
void emit(char *s, ...); 
%} 

%token SELECT 
%start stmt_list 

%% 

stmt_list: stmt ';' 
| stmt_list stmt ';'  
; 
stmt: select_stmt { emit("STMT"); }; 
select_stmt: SELECT {emit("SELECT"); }; 

%% 

void emit(char *s, ...) { 
    extern yylineno; 
    va_list ap; 
    va_start(ap, s); 
    printf("rpn: "); 
    vfprintf(stdout, s, ap); 
    printf("\n"); 
} 

void yyerror(char *s, ...) { 
    extern yylineno; 
    va_list ap; 
    va_start(ap, s); 
    fprintf(stderr, "%d: error: ", yylineno); 
    vfprintf(stderr, s, ap); 
    fprintf(stderr, "\n"); 
} 

main(int ac, char **av){ 
    extern FILE *yyin; 
    if(ac > 1 && (yyin = fopen(av[1], "r")) == NULL) { 
     perror(av[1]); 
     exit(1); 
    } 

    if(!yyparse()) 
     printf("SQL parse worked\n"); 
    else 
     printf("SQL parse failed\n"); 
} 

我的輸出是:

rpn: SELECT 
rpn: STMT 
flex scanner jammed 
+0

對不起,我似乎忘了處理換行符。 Addong [\ t \ n]給詞法分析器解決了這個問題。 – robogos

回答

1

如果沒有找到的話"SELECT" ,或任何標點符號-+&~|^/%*(),.;!,那麼掃描儀不知道該怎麼辦。最後添加一個全接觸:

. { printf("unknown character in input: %c\n", *yytext) } 
+0

我試過了,但結果相同。我認爲它會找到「SELECT」,因爲它會打印它。 – robogos

+1

匹配'\ n'的規則怎麼樣(不包括在'.'中)? – eduffy