2.02 Flex从文件中读取输入

源码详见

/*
// file: 2.02_use_yyin_to_read_data_from_file.y
// flex词法分析器默认从stdin读取输入
//
// 除非你对yyin另做安排,词法分析器总是通过yyin文件描述符读取输入,因此为了让flex从文件读取输入
// 你只需要在第一次调用yylex之前重新设定yyin文件描述符
// */

/*
// flex和lex总是提供了一个小型的库,叫做-lfl,它定义了默认的main例程,同时也定义了早期lex遗留至今的鸡肋——默认版本的yywrap
// flex的较新的版本允许你在词法分析器的开头设定%option noyywrap,来要求不使用yywrap
// lfl库中的main函数,如下:
// int main()
// {
//    while (yylex() != 0);
//    return 0;
// }
// 如果你在flex程序使用%option noyywrap,并且定义了自己的main函数,你就不需要链接-lfl了。
// */
%option noyywrap
%{
int chars = 0;
int words = 0;
int lines = 0;
%}

%%
[a-zA-Z]+         { words++; chars += strlen(yytext); }
\n                { chars++; lines++; }
.                 { chars++;}

%%

int main(int argc, char ** argv)
{
  if ( argc > 1 ) {
    if (! (yyin = fopen(argv[1], "r" ) )){
      perror(argv[1]);
      return 1;
    }
    printf("[I]>>>Read data from file:%s\n", argv[1]);
  }else{
    printf("[I]>>>Read data from stdin.\n");
  }
  yylex();
  printf("chars=%8d\n", chars );
  printf("words=%8d\n", words );
  printf("lines=%8d\n", lines );
  return 0;
}

cmake代码如下:

execute_process(COMMAND
    flex -o ${CMAKE_CURRENT_SOURCE_DIR}/2.02_use_yyin_to_read_data_from_file.c
    ${CMAKE_CURRENT_SOURCE_DIR}/2.02_use_yyin_to_read_data_from_file.y)

add_executable(2.02_use_yyin_to_read_data_from_file 2.02_use_yyin_to_read_data_from_file.c)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值