看了 mysql parse 着手看了看 yyparse
include.h
#ifndef MAIN_HPP
#define MAIN_HPP
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
#define YYSTYPE string
#endif
lex.l
%{
#include "include.h"
#include "yacc.tab.h"
extern "C"
{
int yywrap(void);
int yylex(void);
}
%}
%%
"abc" {
yylval = yytext;
return ABC;
}
"123" {
yylval = yytext;
return A123;
}
%%
int yywrap(void)
{
puts("-----the file is end");
return 1;
}
yacc.y
%{
#include "include.h"
extern "C"
{
void yyerror(const char *s);
extern int yylex(void);
}
%}
%token ABC
%token A123
//%type tokens
%%
file:
tokens
{
cout<<"all abc:"<<$1<<endl;
};
tokens:
{
cout<< "3";
}
| tokens ABC A123
{
$$ = $2;
cout<<"----->"<<$2<<"---->"<<$3<<endl;
}
;
%%
void yyerror(const char *s)
{
cerr<<"err:"<<s<<endl;
}
int main()
{
const char* sFile="file.txt";
FILE* fp=fopen(sFile, "r");
if(fp==NULL)
{
printf("cannot open %s\n", sFile);
return -1;
}
extern FILE* yyin;
yyin=fp;
printf("-----begin parsing %s\n", sFile);
yyparse();
puts("-----end parsing");
fclose(fp);
return 0;
}
file.txt</>
abc 123
Makefile
LEX=flex
YACC=bison
CC=g++
OBJECT=main
$(OBJECT):clean lex.yy.o yacc.tab.o
$(CC) lex.yy.o yacc.tab.o -o $(OBJECT)
@./$(OBJECT) #编译后立刻运行
lex.yy.o: lex.yy.c yacc.tab.h
$(CC) -c lex.yy.c
yacc.tab.o: yacc.tab.c
$(CC) -c yacc.tab.c
yacc.tab.c yacc.tab.h:
$(YACC) -d yacc.y
lex.yy.c: #lex.l
$(LEX) lex.l
clean:
@rm -f $(OBJECT) *.o
@rm -f yacc.tab.c lex.yy.c yacc.tab.h