编译原理之词法分析程序的设计与实现

一、程序要求(以python为例)。

1.词法分析程序(Lexical Analyzer)要求:

- 从左至右扫描构成源程序的字符流

-  识别出有词法意义的单词(Lexemes

-  返回单词记录(单词类别,单词本身)

-  滤掉空格

-  跳过注释

-  发现词法错误

2.程序结构:

输入:字符流(什么输入方式,什么数据结构保存)

处理:

–遍历(什么遍历方式)

–词法规则

输出:单词流(什么输出形式)

–二元组

3.单词类别:

1.标识符(10)

2.无符号数(11)

3.保留字(一词一码)

4.运算符(一词一码)

5.界符(一词一码)


单词符号


种别码


单词符号


种别码


begin


1


:


17


if


2


:=


18


then


3


<


20


while


4


<=


21


do


5


<>


22


end


6


>


23


l(l|d)*


10


>=


24


dd*


11


=


25


+


13


;


26


-


14


(


27


*


15


)


28


/


16


#


0

二、代码实现(以python为例)。

1.词法分析程序。

 1 import re
 2
 3
 4 strs = "if sum >= 1000 then x : x - 1;#"+" "
 5
 6 types = {‘begin‘:1,
 7          ‘if‘:2,
 8          ‘then‘:3,
 9          ‘while‘:4,
10          ‘do‘:5,
11          ‘end‘:6,
12          ‘l(l|d)*‘:10,
13          ‘dd*‘:11,
14          ‘+‘:13,
15          ‘-‘:14,
16          ‘*‘:15,
17          ‘/‘:16,
18          ‘:‘:17,
19          ‘:=‘:18,
20          ‘<‘:20,
21          ‘<=‘:21,
22          ‘<>‘:22,
23          ‘>‘:23,
24          ‘>=‘:24,
25          ‘=‘:25,
26          ‘;‘:26,
27          ‘(‘:27,
28          ‘)‘:28,
29          ‘#‘:0
30         }
31
32 if __name__ == ‘__main__‘:
33     # strs = input(‘请输入程序代码:‘)+" " #补位
34
35     index = 0
36     while index < len(strs):
37         keyIndex = 0
38         for key in types.keys():
39             if index+len(key) < len(strs):
40                 if strs[index:index+len(key)] == key and not re.match(‘^[=a-zA-Z0-9_-]$‘, strs[index+len(key)]):
41                     if not(strs[index] == ‘=‘ and re.match(‘^[<>]$‘, strs[index-1])):
42                         ss = strs[index:index+len(key)]
43                         print((ss, types.get(ss)))
44                 elif re.match(‘^[a-zA-Z0-9_]+‘, strs[index:]):
45                     ss = re.match(‘^([a-zA-Z0-9_]+)‘, strs[index:]).group()
46                     if not types.get(ss):
47                         if re.match(‘[a-zA-Z]+‘, ss):
48                             print((ss, ‘标识符‘))
49                         elif re.match(‘\d+‘, ss):
50                             print((ss, ‘数字‘))
51                         else:
52                             print((ss, ‘其他‘))
53                     index += len(ss)
54             keyIndex+=1
55         index+=1

  2.运行结果展示。

  

原文地址:https://www.cnblogs.com/Rakers1024/p/11640718.html

时间: 2024-08-18 17:43:07

编译原理之词法分析程序的设计与实现的相关文章

[编译原理学习]词法分析

此前一直没能系统完整地学过编译原理,只有很粗浅的理解,虽然其实对工作里的任务也没啥影响,但总觉得缺了一大块知识,加上对所谓程序员三大浪漫(编译器,操作系统,图形学)的向往,所以最近跟着网易云课堂推出的计算机专业课程来学习编译原理.无奈生性懒惰,常常下班之后觉得累了,打打游戏啊看看视频啊,拖延症就犯了.......所以在这里打算将学习的过程,心得记录下来,也算是对自己的一个督促.课程传送门http://mooc.study.163.com/learn/USTC-1000002001#/learn/

05 词法分析程序的设计与实现 10/10

词法分析程序(Lexical Analyzer)要求: - 从左至右扫描构成源程序的字符流 -  识别出有词法意义的单词(Lexemes) -  返回单词记录(单词类别,单词本身) -  滤掉空格 -  跳过注释 -  发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码)

词法分析程序的设计与实现

词法分析程序(Lexical Analyzer)要求: - 从左至右扫描构成源程序的字符流 -  识别出有词法意义的单词(Lexemes) -  返回单词记录(单词类别,单词本身) -  滤掉空格 -  跳过注释 -  发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码)

5.词法分析程序的设计与实现

词法分析程序(Lexical Analyzer)要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词(Lexemes) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号

编译原理学习--词法分析(1)

词法分析的任务: 首先,从阶段上来看,编译器可分为若干个中间阶段: 典型的,可以包含为一个前端,一个后端.前端接收源程序产生一个中间表示,后端接收表示继续生成一个目标程序.所以,前端处理的是跟源语言有关的属性,后端处理跟目标机器有关的属性. 更细节的,前端可以划分为若干个阶段: 下面我们看看词法分析器的任务: 词法分析器读入程序员写的程序,然后对字符流做切分成记号流.举个例子: 这是一个程序员看到的字符流 词法分析器将字符流读入,根据关键字.标识符.标点.字符串.整形数等进行划分,形成记号流(单

编译原理学习--词法分析(2)

自动生成的词法分析器跟之前讲的图转移算法是类似的,因为是自动生成,为了把整个流程形式化,需要用另外一个数学工具--有限状态自动机. 从数学上讲,有限状态自动机是什么概念呢? 输入一个字符串,如果字符串能够接受,则输出Yes,否则输出No.有限状态自动机是一个五元组,M=(S, Σ, δ, q0, F),其中,Σ-输入字母表,S- 状态集,q0-初始状态,F-终结状态集,δ-转移函数. 举个例子,什么样的串可以被接受? 由图可知,Σ={a,b},S={0,1,2},q0=0,F={2},δ函数如下

程序员的三大浪漫之一——编译原理

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 我认为,既然编译过程是将一种语言翻译为另一种语言的计算机程序的过程,顾名思义,编译原理就是为我们解释计算机是如何将一种语言翻译成另一种语言这

0909关于编译原理的理解

1.编译原理学什么? 答:编译原理学习做程序的编译器的原理和方法,内容包括语言和文法.词法分析.语法分析.语法制导翻译和中间代码生成.储存管理.代码优化和目标代码生成等内容. 2.为什么学编译原理? 答:编译原理蕴含着计算机科学中解决问题的思路.形式化问题和解决问题的方法,对软件的设计开发具有一定的指导作用,学习它可以更了解程序本身,对以后的学习有一定的帮助. 3.怎么学编译原理? 答:对于编译原理一上手可能会有难度,课堂上要认真听讲.做笔记,不懂之处一定要提出,但更重要的是要注重结合程序来代码

编译原理——正规式转DFA算法概述

一.概念概述 给定一个单词,判断该单词是否满足我们给定的单词描述规则,需要用到编译原理中词法分析的相关知识,其中涉及到的两个很重要的概念就是正规式(Regular Expression)和有穷自动机(Finite Automata).正规式是描述单词规则的工具,首先要明确的一点是所有单词组成的是一个无穷的集合,而正规式正是描述这种无穷集合的一个工具:有穷自动机则是识别正规式的一个有效的工具,它分为确定的有穷自动机(Deterministic Finite Automata,DFA)和不确定的有穷