词法分析器总结

总结一些编译原理词法分析的内容。

1 简单介绍

  对于编译语言而言,程序都需要通过编译器编译成二进制的代码,这样才可以在计算机上运行。对于现在的程序而言,并不能直接将其翻译成二进制可执行文件。中间需要若干中间环节,其中通常包含词法分析器,语法分析器,语意分析器。这里主要总结一下词法分析器。

  词法分析器的主要功能是将程序切分为一个个单词,并将单词进行相关的分类。

1 int x;
2 x = 10;

比如说以上最简单的一个赋值语句。经过词法分析后,就会被切分成,其中的一些空格等等都会被处理过滤掉

1 INT ID(X) SEMICOLON
2 ID(X) EQ INT(10)

这里对于词法分析器的实现通常有两种方法,一种手工编码实现,一种通过自动实现。

其中自动实现,即需要通过某种语言实现对程序相关单词的准确定义。这里通常使用的是正则表达式的方法。

2 相关算法

 

这里我简单画了下词法分析器的一些算法与涉及的概念。需要指出的是自动实现的三种算法实际是一种递进的关系。即

RE描述->Thompson算法->子集构造算法->Hopcroft算法->代码

其中每一个算法输出结果是下个算法的输入。为了解决NFA到DFA最小化的问题。其中Thompson算法解决的是RE->NFA的问题,子集构造算法解决的是NFA到DFA的问题,Hopcroft解决的是DFA最小化的问题。

时间: 2024-10-12 20:33:04

词法分析器总结的相关文章

词法分析器

相关定义: 识别器:可以在字符流中识别特定单词的程序. 有限自动机(FA):识别器的一种形式化方法,包含一个有限状态集,一个字母表,一个转移函数,一个起始状态和一个或多个接受状态. 正则表达式:有限自动机所接受的单词的集合,形成的语言.eg:n(ew|ot) RE--NFA--DFA--最小DFA--词法分析器 RE-NFA:Thompson构造法,re的连接,选择,闭包等有一个模板,各部分的连接也有一个模板,按照模板构造 NFA--DFA:子集构造法(不动点计算,即即便计算过程中不断添加要计算

词法分析器实验报告

一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试  1.      源程序名:cffx.cpp 可执

编译原理简单词法分析器(first,follow,分析表)源码下载

编译原理(简单词法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90%E5%99%A8.zip

【词法分析器 】 编译原理作业

自己写的版本: 问题: 1:考虑到由于是嵌套接收,浮点型感觉少麻烦,因为还要判断是否两个小数点等,古没有实现 2:对于一些特殊符号,如三元运算符,格式控制符%d等分析不到位 3:类别应该分的更细,否则用唯一的symbol(sym)标识的话无法进行后续的语法分析 4:没有用文件指针,数据输入要在控制台,不利于交互 #include <iostream> #include <string.h> #include <cstdio> using namespace std; i

词法分析器 /c++实现

#include<iostream> #include<string> #include<vector> #include<map> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; int line=1,row=1; char c; map<char,int>ma; struct kind { string na

词法分析器:代码注释

前沿:词法分析器是将一段程序的代码按照类别分开.一般来说是将关键字, 变量名  , 常数 运算符( + _ * / )和界符分类词法分析算是编译的基础把今天上编译原理的实验课, 看了看  老师给的代码 添加了一些注释大致的流程是这样的:规定关键字的符号是10数字的符号是数字本身+ - *  = 这些符号代码中的case里面有(分别是13 14 ...),可以看懂的首先, 把程序存到制定的内存区域, 这里是划出了一个连续的空间(放到字符数组);然后再按字节读取里面的内容 , 当读到空格(" &qu

简易词法分析器

最近开始学习编译器,希望能坚持下去,通过做编译器也把c++练好点,今天花了一天做了一个简单的词法分析器,过几天编译原理书到了后,希望能通过看书得到更好的方法. //learn.cpp #include <iostream> #include "learn.h" #include <fstream> using namespace std; static char *st_line; static int st_line_pos; int length; type

编译器实践 二 之 小型的词法分析器

下面是一个简单的词法分析器 #include <stdio.h> #include <string.h> using namespace std ; int main() { char str[150] ; // freopen("C:\\Users\\Lionel\\Desktop\\1.txt","r",stdin) ; int row = 1 , cow = 0 ; while(gets(str)) { char temp[10] ;

编译原理(简单自动词法分析器LEX)

编译原理(简单自动词法分析器LEX)源程序下载地址:  http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7%90%86%E7%AE%80%E5%8D%95LEX%EF%BC%88%E8%AF%8D%E6%B3%95%E8%87%AA%E5%8A%A8%E5%88%86%E6%9E%90%E5%99%A8%EF%BC%89.zip