编写词法分析程序

本文记录了学习编译原理的过程,重点探讨TEST语言的词法规则,包括标识符、保留字、无符号整数、分界符、运算符和注释符的正则表达式。通过构建NFA和DFA,最终实现词法分析程序的编写,并进行了程序测试和分词结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Note:

这学期修了严厉的Mr.J的编译原理,不定期更新笔记!
欢迎指正!


TEST 语言的词法规:
  • 标识符:字母打头,后接任意字母或数字

  • 保留字:标识符的子集,包括:if,else,for,while,do, int,write,read,

  • 无符号整数:由数字组成,但最高位不能为0,允许一位的0,

  • 分界符:(、)、;、{、}

  • 运算符:+、-、*、/、=、<、>、>=、<=、!=、==

  • 注释符:/* */


正则表达式:
  • 标识符:        ( a|b|……|z|A|B……|Z )( 0|1|……|9| a|b|……|z|A|B……|Z )*

  • 保留字:        标识符的子集

  • 无符号整数: ( (1……|9 )( 0|1|……|9)* )|0

  • 分界符:        ( | ) | ; | { | }

  • 运算符:        + | - | * | / | = | < | > | >= | <= | != | ==

  • 注释符:        /* (other)* */

NFA

不确定的有穷自动机


DFA

将NFA确定化之后得到的DFA

确定的有穷自动机


程序测试

依据DFA编写词法分析程序

  • 测试数据:
/*This a test program.*/
int abc;
int 123;
int A$@;
int i;
int n;
int b,c;
int 2a;
int a2;
read n;
n = 012345;
for (i=1;i<=n; i= i+1)
{ 
abc=abc+i;
}
if (!n) b = b+c;
/*The loop ended
write abc;
}
  • 测试结果:

控制台报错

  • 分词结果:
    这里写图片描述这里写图片描述

SourceCode
#include<stdio.h>
根据最小的DFA(确定性有限自动机)编写词法分析程序编译原理中的一个重要步骤。词法分析器的主要任务是将源代码转换为一系列的记号(tokens),这些记号是语法分析器的基本输入。以下是编写词法分析程序的基本步骤: ### 1. 定义词法规范 首先,需要定义词法规范,即源代码中允许出现的记号的类型和格式。例如,整数、标识符、关键字、操作符等。 ### 2. 构建DFA 根据词法规范构建DFA。DFA是一个有向图,其中节点表示状态,边表示输入符号,初始状态和接受状态需要明确标识。 ### 3. 实现DFA 将DFA转换为代码。可以使用表驱动或直接编码的方式实现DFA。 ### 4. 处理输入 逐字符读取源代码输入,并根据DFA的状态转换规则进行状态转移,直到到达接受状态或遇到错误。 ### 5. 生成记号 在到达接受状态时,根据当前状态和输入生成相应的记号,并重置DFA状态以处理下一个记号。 ### 示例代码 以下是一个简单的示例代码,演示如何根据DFA编写词法分析程序: ```python class Token: def __init__(self, type, value): self.type = type self.value = value class Lexer: def __init__(self, input): self.input = input self.pos = 0 self.current_char = self.input[self.pos] if self.input else None def advance(self): self.pos += 1 if self.pos < len(self.input): self.current_char = self.input[self.pos] else: self.current_char = None def get_next_token(self): while self.current_char is not None: if self.current_char.isspace(): self.advance() continue elif self.current_char.isdigit(): return self.number() elif self.current_char.isalpha(): return self.identifier() else: return Token(self.current_char, self.current_char) return Token('EOF', None) def number(self): result = '' while self.current_char is not None and self.current_char.isdigit(): result += self.current_char self.advance() return Token('NUMBER', int(result)) def identifier(self): result = '' while self.current_char is not None and self.current_char.isalnum(): result += self.current_char self.advance() return Token('IDENTIFIER', result) # 示例使用 input_text = "123 + 456" lexer = Lexer(input_text) token = lexer.get_next_token() while token.type != 'EOF': print(token.type, token.value) token = lexer.get_next_token() ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值