从lex&yacc说到编译器(通讯录问题 1)

利用lex和yacc解决通讯录问题(1)

 

前言

一般的编译原理教材上关于使用lex和yacc构造词法分析的好例子并不多.很多教程都只是在讲解词法分析和语法分析的时候简单地提到了一下lex和yacc这两个工具,甚至有很多国内的大学教材对lex和yacc只字不提。其实lex和Yacc并非只是为了构造编译系统而开发的。本节通过一个提取通讯记录的信息的简单问题,来讲解一下lex和yacc的使用.

提取通讯录的信息

前几天收到朋友询问一下如何通过词法,语言分析,把一个通讯录中的人物姓名和电话号码的信息提取出来。我把问题改了一下,大致如下:

 

我有个记事本,里面的信息都是电话机生成的通讯记录信息。以文本格式保存在

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Lex和Yacc是Unix系统中的常见工具,它们可以用于生成编译器的词法分析器和语法分析器。我们可以使用这两个工具来实现一个简单的C编译器。 下面是一个实现C编译器的基本步骤: 1. 设计语法规则:首先需要确定C语言的语法规则。可以参考C语言标准来确定语法规则,并将其表示为BNF范式。 2. 编写Lex文件:根据语法规则,编写Lex文件。Lex文件包含正则表达式和对应的动作,用于生成词法分析器。词法分析器会根据输入的源代码逐个读取字符并生成词法单元。 3. 编写Yacc文件:根据语法规则,编写Yacc文件。Yacc文件包含语法规则和对应的动作,用于生成语法分析器。语法分析器会根据词法分析器生成的词法单元,逐步构建语法树,并执行对应的动作。 4. 编写代码生成器:根据语法树,生成对应的目标代码。 下面是一个简单的例子,用于演示如何使用Lex和Yacc生成C编译器: 首先,我们需要定义C语言的语法规则。例如,我们可以定义一个简单的语法规则,用于表示一个整数常量: ``` <constant> ::= <digit> | <digit> <constant> <digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ``` 接下来,我们可以编写Lex文件,用于生成词法分析器。例如,我们可以编写如下的Lex文件: ```lex %{ #include <stdio.h> #include <stdlib.h> %} DIGIT [0-9] %% {DIGIT}+ { printf("CONSTANT: %s\n", yytext); return CONSTANT; } . { return yytext[0]; } %% int yywrap() { return 1; } ``` 在上面的代码中,我们使用了Lex的正则表达式来匹配整数常量。当遇到一个整数常量时,我们会打印出它的值,并返回对应的词法单元CONSTANT。 接下来,我们编写Yacc文件,用于生成语法分析器。例如,我们可以编写如下的Yacc文件: ```yacc %{ #include <stdio.h> #include <stdlib.h> #include <string.h> int yylex(); void yyerror(char *); %} %token CONSTANT %% program: statement_list ; statement_list: statement | statement_list statement ; statement: expression_statement ; expression_statement: CONSTANT ; %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); } int main() { yyparse(); return 0; } ``` 在上面的代码中,我们定义了一个简单的语法规则,用于表示一个整数常量。当遇到一个整数常量时,我们会执行对应的动作。 最后,我们还需要编写代码生成器,用于生成对应的目标代码。由于这超出了本题的范围,这里不再给出具体实现。 综上所述,上述步骤就是使用Lex和Yacc实现C编译器的基本步骤。当然,实际上还有许多细节需要考虑,例如错误处理、符号表管理等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HashCodeWithJava

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值