编译原理-词法分析

本文详细介绍了编译原理中的词法分析过程,包括词法分析器的作用、串和语言的概念、正规式(正则表达式)、词法记号识别以及有限自动机,特别是确定的有限自动机(DFA)和不确定的有限自动机(NFA)的构建与对比。通过实例展示了如何将正规式转换为NFA,以及如何通过NFA构建DFA。最后,探讨了DFA的化简方法,确保词法分析的高效性和准确性。
摘要由CSDN通过智能技术生成

编译原理-词法分析

注意: 此文章中|| 与 | 符号意义相同

词法分析器

  • 词法分析器: 把构成源程序的字符流翻译成记号(token)流,还完成和用户接口的一些任务
    其中:
    • 词法单元: 亦称单词, 编程语言中合法的字符串
    • 词法记号: 满足某种给定规则(模式)的词法单元
      示例: 对于词法记号NUM, 其词法单元可能有3.1, 10, 2.8E12等数字, 其"模式"即"认定为数字的字符串"

串和语言

  • 字母表: 符号的有限集合. 示例: Σ = {0,1}
  • 串: 符号的有穷序列. 示例: 0110,ε(长度为0的空串)
    运算:
    • 连接: xy, 其中sε = εs = s
    • 积: s 0 = ϵ , s i = s i − 1 s ( i > 0 ) s^0 = \epsilon , s^i = s^{i-1}s(i>0) s0=ϵ,si=si1s(i>0)
  • 语言: 字母表上的一个串集. 示例: {ε, 0, 11, …}, {ε}, ∅
    运算:
    • 和: L ⋃ M = { s ∣ s ∈ L 或 s ∈ M } L \bigcup M = \{s|s \in L 或 s \in M \} LM={ ssLsM}
    • 连接: L M = { s t ∣ s ∈ L 且 s ∈ M } LM = \{st|s \in L 且 s \in M\} LM={ stsLsM}
    • 指数: L 0 = { ε } , L i = L i − 1 L L^0=\{ε\}, L^i = L^{i-1}L L0={ ε},Li=Li1L
    • 闭包: L ∗ = L 0 ⋃ L 1 ⋃ L 2 ⋃ . . . L^* = L^0\bigcup L^1\bigcup L^2\bigcup ... L
实验一 用PL/O语言编写用户源程序 (一)实验目的:  1了解运行TURBO PASCAL系统对计算机软硬件环境的要求。 2熟悉PASCAL系统中的基本语句及文件类型的使用方法。 3掌握PL/O语言源程序的结构及构成规则。 (二)实验内容与步骤  1用PL/0语言编写程序:建立和访问正文文件 2用PL/O语言编写能打印如下图形的程序 * * * * * * * * * * * * * * * * * * * * * * * * * 3用PL/O语言编写求3~100之间全部素数的程序。 4 将一正数倒置。 5 对任意给定的整数,列出其二进制、八进制、十六进制表示形式。 6深刻理解源程序、目标程序、编译程序的概念。 7用EBNF描述PL/O语言的程序结构及构成规则。 注:  实验二 构造识别符号串的自动机 (一)实验目的: 1掌握形式语言与自动机的概念 2了解正规集及有穷自动机的关系 3能构造识别相应符号串的自动机 4能构造词法分析程序所识别的各类单词的自动机 (二)实验步骤及内容: 1用高级语言编写程序:该程序能接受所有的标识符。 2用高级语言编写程序:该程序能接受所有的常数(整数和定点小数)。 3用高级语言编写程序:该程序能接受PL/0的所有保留字。 4 用高级语言编写程序:该程序能接受PL/0的所有界符、运算符。 (三)有关说明:  1高级及语言可选择 C语言实现。 2以上各程序要求:对输入的任意符号串能给出接受与否的识别信息。 实验三 词法分析程序的构造 (一)实验目的 1掌握PL/O编译程序的使用方法 2掌握PL/O编译程序的总体结构 3掌握PL/O编译程序的词法分析程序 4改编总控程序和词法分析程序 (二)实验内容及步骤 1单词的分类: 可将所有标识符归为一类;将常数归为另一类:保留字、界符、运算符符则可采取一词一类。 2符号表的建立 可事先建立一保留字表,以备识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。 3单词串的输出形式: 所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该常数(整数)的二进制形式)。对于保留字、界符和运算符,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。(或:为便于查看由词法分析程序输出的单词串也可以在CLASS字段上放置单词符号串本身)。 4编写上述词法分析程序 (三)有关说明:  1该词法分析程序只能识别用PL/O语言书写的简单程序。 2也可改编PL/O的编译程序中的词法分析程序,使之能识别含repeat语句的程序。 
这个里面的都是测试数据,总共得分5分。从控制台输入,不能从文件中读取。实现了基本功能,加分项目都没有去实现,没有函数数组这些的实现。这是用C++语言写的,新建parser类别要选C++,其他对于VS的配置和C语言一样。for语句用的是枚举所有情况,你可以自行修改。 对预备工作中自然语言描述的简化C编译器的语言特性的语法,设计上下文无关文法进行描述 借助Yacc工具实现语法分析器 考虑语法树的构造: 1.语法树数据结构的设计:节点类型的设定,不同类型节点应保存哪些信息,多叉树的实现方式 2.实现辅助函数,完成节点创建、树创建等功能 3.利用辅助函数,修改上下文无关文法,设计翻译模式 4.修改Yacc程序,实现能构造语法树的分析器 考虑符号表处理的扩充 1.完成语法分析后,符号表项应增加哪些标识符的属性,保存语法分析的结果 2.如何扩充符号表数据结构,Yacc程序如何与Lex程序交互,正确填写符号表项 以一个简单的C源程序验证你的语法分析器,可以文本方式输出语法树结构,以节点编号输出父子关系,来验证分析器的正确性,如下例: main() { int a, b; if (a == 0) a = b + 1; } 可能的输出为: 0 : Type Specifier, integer, Children: 1 : ID Declaration, symbol: a Children: 2 : ID Declaration, symbol: b Children: 3 : Var Declaration, Children: 0 1 2 4 : ID Declaration, symbol: a Children: 5 : Const Declaration, value:0, Children: 6 : Expr, op: ==, Children: 4 5 7 : ID Declaration, symbol: a Children: 8 : ID Declaration, symbol: b Children: 9 : Const Declaration, value:1, Children: 10: Expr, op: +, Children: 8 9 11: Expr, op: =, Children: 7 10 12: if statement, Children: 6 11 13: compound statement, Children: 3 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值