• 从自己的程序中使用lex的一个小例子


    网上很多例子,都是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 \n ++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\n\n");
    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会从标准输入来读信息流的。

    第二步,编写我的主程序:

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

    第三步,编写头文件:

    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]# 

    结束!

  • 相关阅读:
    内存对齐
    总结一下,一晃工作有一年了
    标准库中迭代器的关系
    反转迭代器和插入迭代器的区别
    MFC定时关机程序的实现3-最小化到托盘栏
    MFC定时关机程序的实现2-添加启动项到注册表
    MFC定时关机程序的实现1
    C++文件读写之对象的读写
    ADO之密码验证--3次错误就锁定『改进』
    ADO之密码验证--3次错误就锁定
  • 原文地址:https://www.cnblogs.com/gaojian/p/3083290.html
Copyright © 2020-2023  润新知