2014-03-28 3 views
0

나는 John R. Levine의 저서에서 flex와 bison을 배우고있다. 나는 하나의 'SELECT;'를 읽고 싶다. 내 코드가 읽는 파일의 내용입니다. 그러나 'flex scanner jammed'가 나타납니다. 코드에 어떤 문제가 있습니까?플렉스 비손 간단한 예

렉서 : 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

죄송합니다. 개행 문자를 처리하는 것을 잊어 버린 것 같습니다. 렉서에게 아룡 [\ t \ n]이 문제를 해결합니다. – robogos

답변

1

이 단어를 찾을 수없는 경우 "SELECT" , 또는 구두점 -+&~|^/%*(),.;! 중 하나 일 경우 스캐너가 어떻게해야할지 모릅니다. 마지막에 캐치 올을 추가하십시오.

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

나는 시도했지만, 같은 결과가 나왔다. 나는 그것을 인쇄하기 때문에 그것이 "선택"이라고 생각합니다. – robogos

+1

'\ n' ('.'에 포함되지 않은 규칙)과 일치하는 규칙은 무엇입니까? – eduffy