比较古老的东西了,保存一下以备后用。 sql.l %{ #include "y.tab.h" #include "sql.h" int state = 0; char buff[128] = {0}; #if BEBUG #else typedef char* YYTYPE; extern YYTYPE yylval; #endif %} /* lex file for sql syntax */ letter [a-zA-Z] digit [0-9] integer {digit}+ comp_op [<>=] lpen ( rpen ) ast "*" delimiter [ /t] name {letter}({letter}|{digit})* %% "create" { strcpy(buff,yytext); state = CREATE; #if DEBUG printf("C"); #endif } "table" { strcpy(buff,yytext); state = TABLE; DEBUG && printf("T"); } {name} { strcpy(buff,yytext); state = NAME; #if DEBUG printf("N"); #endif } {ast} { strcpy(buff,yytext); state = AST; #if DEBUG printf("*"); #endif } {delimiter} { #if DEBUG printf("_"); #else yylval = buff; #endif return state; } . {printf(".");return 0 ;} %% int yywrap() { return 1; } #if DEBUG int main() { int a; int i; yyin = fopen("test.sql","r"); for(i= 0;i<5;i++) { a = yylex(); switch(a) { case CREATE: printf("C"); break; case TABLE: printf("T"); break; case NAME: printf("N"); break; default: break; } } return 0; } #endif sql.h #ifndef SQL_H #define SQL_H #define DEBUG 0 #endif sql.y %{ #include <stdio.h> extern FILE* yyin; /* for later user */ %} %token SELECT CREATE DROP TABLE WHERE ORDER BY NAME AST %% statement: create_table_statement {printf("ok");} create_table_statement: CREATE {printf($1);} TABLE {printf($3);} table_name attribute_type_list table_name: NAME {printf("N");} attribute_type_list:NAME {printf("n");} %% void yyerror() { printf("error"); } int main() { yyin = fopen("test.sql","r"); yyparse(); return 1; }