基于FLEX构造词法分析器

概述

        用 FLEX编写一个词法分析器,能够将输入的源程序转换为单词序列输出。

实验要求

  • 该语言的关键字:if while do break real true false int char bool float (其中,int、char、bool、float在产生式中为basic)
  • id和num的正则表达式定义
  • 专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */
  • 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开id,num关键字。
  • 程序书写格式自由:一行可以有多个语句,一个语句也可以有多行,单词之间可以插入任意空格。
  • 考虑注释。注释由/*和*/包含。注释可以放在任何空白出现的位置,且可以超过一行。注释不能嵌套。

输出示例

源程序输入:

{
    
	int i;
	if ( i >= 0) 
		i = i + 1;
} 

输出token序列如下:
{,
int,
(id, i)
;,
if,
(,
(id, i)
=,
(num, 0)
(id, i)
=,
(id, i)
+,
(num, 1)

实现思路

1.简单字符正则表达式

  • 常用字符的识别
delim		[ \t\n]
ws			{
   delim}+
letter		[A-Za-z]
digit		[0-9]
id			{
   letter}({
   letter}|{
   digit})*
number		{
   digit}+(\.{
   digit}+)?(E[+-]?{
   digit}+)?
  • 关键字的识别
if|then|else|for|while|return|main|do|break	
{
   	printf("A keyword: %s\n", yytext);}
  • 变量类型的识别
int|char|float  
{
      printf("A value type: %s\n", yytext);}
  • 单行注释的识别
\/\/([^\n])+	
{
   	printf("line comments : %s\n",yytext);}

2.单操作数运算符的处理

        这里只考虑自增“++”和自减“–”的情况。对于单个加号和单个减 号来说,直接识别操作符即可,为了防止连续识别出两个单加号或着两个单减号,对识别加号和减号的处理方式进行一定的修改。

        即,拿加号举例子,若识别到一个加号,先不着急将判断结果输出,而是往后面预读一个字符,若检测到后面的字符也为加号,则判断为自增“++”,否则为二目运算符加号,自减“–”同理。最后还应将预读的字符放回缓冲区。

具体实现如下:

{
   addop}     {
     
                char c;  
                if((c=input())=='+')  
                printf("A single operator: %s%c\n",yytext,c);  
                else {
   printf("An operator: %s\n", yytext);unput(c);}  
            }  
            
{
   subop}     {
     
               char c;  
               if((c=input())=='-'
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值