博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flex Manual基础笔记3
阅读量:6291 次
发布时间:2019-06-22

本文共 2131 字,大约阅读时间需要 7 分钟。

hot3.png

1. 例子1

功能:从标准输入读取一行,分析出其中包含的数字个数和字母个数。

/* filename: input.lex */%{    int digitCount = 0;    int letterCount = 0;%}digit [0-9]letter [a-zA-Z]newline \n%%{digit} digitCount++;{letter} letterCount++;{newline}   return 0;%%int yywrap() { return 1;}    /* main */int main() {    yylex();    printf("Numbers: %d, Letters: %d\n", digitCount, letterCount);    return 0;}

 测试运行:

#flex input.lex #gcc lex.yy.c #./a.out 123abc456defghNumbers: 6, Letters: 8#

说明:理解yylex()函数的作用,其用于进行扫描,每次调用yylex()都是从上一次扫描结束的地方开始。对于这里,只调用了一次,所以就是从标准输入的第一个字符开始扫描。那么,其何时返回呢?遇到return或者文件结束才会返回,所以这里需要newline时候return 0,否则,程序没法结束。

2. 例子2

实际的编译器工作的流程,一般来说扫描器扫描到匹配的token都需要返回,经过一些处理,然后继续扫描,而且一般的编译器的输入都是文件。下面实现一个类似的例子,以文件作为输入,当然,这里不修改输出,一般输出都会结合其他接口去使用,比如yacc。

/* filename: input.lex */%{    int digitCount = 0;    int letterCount = 0;    #define TOKENDIGIT  1    #define TOKENLETTER  2%}digit [0-9]letter [a-zA-Z]newline \n%%{digit} digitCount++;return TOKENDIGIT;{letter} letterCount++;return TOKENLETTER;    /*{newline}   return 0;*/%%int yywrap() { return 1;}void setInputfile(const char* filename) {    FILE* fp = fopen(filename, "r");    if (filename == NULL || fp == NULL) {        printf("Cannot open source file\n");        exit(0);    }    yyin = fp;}    /* main */int main(int argc, char* argv[]) {    if (argc != 2) {        printf("Only and must accept 1 auguments\n");        exit(0);    }    setInputfile(argv[1]);    int token = yylex();    while(token != 0) {        printf("Token type: %d, token: %s, token length: %d\n", token, yytext, yyleng);        token = yylex();    // get next token    }    printf("Numbers: %d, Letters: %d\n", digitCount, letterCount);    return 0;}

测试运行:

#flex input.lex #gcc lex.yy.c #cat test.txt 1ab2d3f#./a.out test.txt Token type: 1, token: 1, token length: 1Token type: 2, token: a, token length: 1Token type: 2, token: b, token length: 1Token type: 1, token: 2, token length: 1Token type: 2, token: d, token length: 1Token type: 1, token: 3, token length: 1Token type: 2, token: f, token length: 1Numbers: 3, Letters: 4#

PS:如果读到文件尾,那么yylex()返回值为0,所以这里是while(token != 0)

转载于:https://my.oschina.net/u/240137/blog/41079

你可能感兴趣的文章
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>
Linux 线程实现机制分析
查看>>
继承自ActionBarActivity的activity的activity theme问题
查看>>
设计模式01:简单工厂模式
查看>>
项目经理笔记一
查看>>
Hibernate一对一外键双向关联
查看>>
mac pro 入手,php环境配置总结
查看>>
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>
spring jpa 配置详解
查看>>
IOE,为什么去IOE?
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>