lex工具

news/2024/11/28 2:55:55/

lex可以辅助生成词法分析程序,我们要做的仅仅是写好相应的正则表达式。
简介:http://www.ibm.com/developerworks/cn/linux/sdk/lex/
实例:找出一个文件中的函数并打印出来
文件tt.lex如下:

%{
#include <stdio.h>
int cnt=0,line=0;
void FindFunc(char *str);
void DoNothing();
%}
chars [a-zA-Z\_\'\"\.]
words {chars}+
identifier [a-zA-Z\_]+[a-zA-Z0-9_]*
ret_type [a-zA-Z\_]+[a-zA-Z0-9_]*
blanks [ \t]+
blanks_opt [ \t]*
func_name [a-zA-Z\_]+[a-zA-Z0-9_]*
left_bracket {blanks_opt}\(
params (({blanks_opt}[a-zA-Z0-9_]+[ \t]+[a-zA-Z \t\_\*&\[\],]*)|({blanks_opt}))
right_bracket {blanks_opt}\)
semicolon [;]?
%%
{ret_type}{blanks}{func_name}{left_bracket}{params}{right_bracket}{semicolon} FindFunc(yytext);cnt++;
. DoNothing();
\n DoNothing();line++;
%%
void main(int argc, char *argv[])
{   
    yyin = fopen(argv[1], "r");
    if (yyin < 0)
    {
        printf("Open file %s failed\n", argv[1]);
        return ;
    }
    yylex();
    printf("%d functions found.\n", cnt);
}

void FindFunc(char *str)
{
    printf("%3d   %s\n", line+1, str);
}

void DoNothing()
{
}


一个lex source file 由三部分组成。
%{
C变量、函数声明
%}
lex标记声明
%%
lex的模式匹配规则
%%
C代码


表达式分析


ret_type [a-zA-Z\_]+[a-zA-Z0-9_]*
blanks [ \t]+
blanks_opt [ \t]*
func_name [a-zA-Z\_]+[a-zA-Z0-9_]*
left_bracket {blanks_opt}\(
param_list (({blanks_opt}[a-zA-Z0-9_]+[ \t]+[a-zA-Z \t\_\*&\[\],]*)|({blanks_opt}))
right_bracket {blanks_opt}\)
semicolon [;]?


/* return type */
ret_type [a-zA-Z\_]+[a-zA-Z0-9_]*


/*one or some blank or tab */
blanks [ \t]+


/* zero or some blank or tab */
blanks_opt [ \t]*


/* function name */
func_name [a-zA-Z\_]+[a-zA-Z0-9_]*


/* left bracket: may have blanks between function name and left bracket */
left_bracket {blanks_opt}\(


/* parameters: NULL or one identifier is need
params (({blanks_opt}[a-zA-Z0-9_]+[ \t]+[a-zA-Z \t\_\*&\[\],]*)|({blanks_opt}))


执行lex tt.lex会生成lex.yy.c文件
gcc -o temp lex.yy.c 生成程序temp

出现错误 undefined reference to `yywrap' 解决方法:gcc -o temp lex.yy.c -lfl

./temp  inputfile.c
打印出inputfile.c中的函数。

 

把输入文件中的小写字母转换成大写字母:

%{
#include <stdio.h>
int cnt=0;
%}
chars [a-zA-Z/_/'/"/.]
lowcase [a-z]
words {chars}+
%%
{lowcase} {yytext[0] = toupper(yytext[0]);cnt++; fprintf(yyout,"%c",yytext[0]);}
. fprintf(yyout, "%c",yytext[0]);
/n  fprintf(yyout, "%c",yytext[0]);
%%
void main(int argc, char *argv[])
{   
    yyin = fopen(argv[1], "r");
    if (yyin < 0)
    {
        printf("Open file %s failed/n", argv[1]);
        return ;
    }
    yyout = fopen(argv[2], "w");
    if (yyout < 0)
    {
        printf("Open file %s failed/n", argv[2]);
        fclose(yyin);
        return;
    }
       
    yylex();
    printf("%d lowcases found./n", cnt);
    fclose(yyin);
    fclose(yyout);
}

Note: 以上程序中 "\" 都被转成了 “/”  。直接从windows粘贴过来的缘故。



http://www.ppmy.cn/news/239791.html

相关文章

莱斯康混响插件合集 – Lexicon PCM LXP MPX Native Reverb WiN

Lexicon PCM LXP MPX Native Reverb WiN | 160M 最后&#xff0c;没有硬件的硬件质量 40多年来&#xff0c;Lexicon被公认为数字混响和效果处理的金标准&#xff0c;并不断引入领先的技术音频行业。Lexicon再次提供了全套最好的混响插件&#xff0c;震惊了音频行业。PCM Native…

LEX 简单入门

youtube : https://www.youtube.com/watch?v54bo1qaHAfk&listPLkB3phqR3X43IRqPT0t1iBfmT5bvn198Z 参考网站 &#xff1a;https://www.ibm.com/developerworks/cn/linux/sdk/lex/ 强烈推荐文章&#xff1a;如何愉快地写个小parser (大神写的真的好&#xff0c;和下面的处…

ElasticSearch6.x插件之IK分词器

IK分词器插件下载地址&#xff1a;git地址 1.下载并安装IK插件 首先下载es对应版本的ik分词器的zip包&#xff0c;上传到es服务器上&#xff0c;在es的安装目录下有一个plugins的目录&#xff0c;在这个目录下创建一个叫ik的目录 然后将解压好的内容&#xff0c;拷贝到ik目录…

JDBC 拾枝杂谈—入门篇(通俗易懂)

目录 一、前言 二、JDBC介绍 1.基本概述 : 2.基本原理 : 三、JDBC模拟 1.模拟接口 &#xff1a; 2.模拟实现类 : 3.模拟测试类 : 4.模拟扩展 : 四、JDBC入门 1.编写JDBC程序的核心四部曲 : &#xff08;全文背诵&#xff09; 2.准备工作 : ①导入jar包 ②创建测试表 …

Lexer(Ver. Hand)

本文介绍如何手撕词法分析器&#xff0c;整体来说难度不大&#xff0c;还是文件读取麻烦。 lexer.h #ifndef LEXER_H #define LEXER_H#include <iostream> #include <fstream> #include <vector> #include <string>using namespace std;enum token_typ…

【Pytorch】模型摘要信息获取、模型参数获取及模型保存的三种方法

目录 问题一&#xff1a;模型摘要信息的获取问题二&#xff1a;模型参数的获取问题三&#xff1a;模型的保存方式 问题1&#xff1a;我想得到模型的摘要信息&#xff0c;包括每一层的名称、输入尺寸、输出尺寸以及参数量。 PyTorch Summary是一个用于计算模型参数量和输出尺…

Databend 开源周报第 96 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 虚拟列 查询 J…

djangoo配置与运行

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…