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