自分のプログラムからlexを使う小さな例
6558 ワード
ネット上の多くの例はyaccとlexが結合している.lexを単純に使う例を探したいです.そして、私のメインプログラムから呼び出すことができます.
アッププログラム:
最初のステップはflexファイルの作成:example.flex
ネット上で見つけたのは、行数と文字数をカウントする機能です.
ここで、flexファイルではmainメソッドを宣言していません.宣言してもflex exampleに生成されます.flex後に得られたlex.yy.c中.
私は自分のプログラムから呼び出したいので、このcounter関数に名前を付けました.
上のyy_に特に注意してください.scan_string関数呼び出しです.呼び出しがなければ、yylexは標準入力から情報ストリームを読みます.
2つ目は、私のメインプログラムを作成します.
ステップ3では、ヘッダファイルを作成します.
最後に、コンパイルと実行を行います.
終わりだ!
アッププログラム:
最初のステップは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]#
終わりだ!