自分のプログラムからlexを使う小さな例

6558 ワード

ネット上の多くの例はyaccとlexが結合している.lexを単純に使う例を探したいです.そして、私のメインプログラムから呼び出すことができます.
アッププログラム:
最初のステップはflexファイルの作成:example.flex
ネット上で見つけたのは、行数と文字数をカウントする機能です.
 1 [root@cop01 tst]# cat example.flex

 2 /* name: example.flex */

 3 %option noyywrap

 4 %{

 5 int num_lines =0, num_chars=0;

 6 %}

 7 %%

 8 

 9 
++num_lines; ++num_chars; 10 . ++num_chars; 11 12 %% 13 14 int counter(char *stream,int *nlines,int *nchars) 15 { 16 yy_scan_string("a test string

"); 17 yylex(); 18 *nlines=num_lines; 19 *nchars=num_chars; 20 return 0; 21 22 } 23 [root@cop01 tst]#

ここで、flexファイルではmainメソッドを宣言していません.宣言してもflex exampleに生成されます.flex後に得られたlex.yy.c中.
私は自分のプログラムから呼び出したいので、このcounter関数に名前を付けました.
上のyy_に特に注意してください.scan_string関数呼び出しです.呼び出しがなければ、yylexは標準入力から情報ストリームを読みます.
2つ目は、私のメインプログラムを作成します.
 1 [root@cop01 tst]# cat test.c

 2 #include <stdio.h>

 3 #include "test.h"

 4 

 5 int main()

 6 {

 7   char cstart[50]="This is an example

"; 8 int plines=0; 9 int pchars=0; 10 counter(cstart,&plines,&pchars); 11 12 fprintf(stderr,"lines counted: %d
",plines); 13 fprintf(stderr,"chars counted: %d
",pchars); 14 15 return 0; 16 } 17 [root@cop01 tst]#

ステップ3では、ヘッダファイルを作成します.
1 [root@cop01 tst]# cat test.h

2 int counter(char *stream,int *nlines,int *nchars);

3 [root@cop01 tst]# 

最後に、コンパイルと実行を行います.
1 [root@cop01 tst]# gcc -g -Wall -c lex.yy.c

2 lex.yy.c:974: warning: ‘yyunput’ defined but not used

3 [root@cop01 tst]# gcc -g -Wall -c test.c

4 [root@cop01 tst]# gcc -g -Wall -o test test.o lex.yy.o

5 [root@cop01 tst]# ./test

6 lines counted: 2 

7 chars counted: 15 

8 [root@cop01 tst]# 

終わりだ!