2014-03-28 190 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