词法分析学习

任务:

源文件->记号流

方法:

1. 手工构造

2. 自动构造

手工构造:

实现标识符与关键字通过转移图完成.

然后再通过hashtable特判即可.

自动构造:

Thompson算法将正则表达式转化为NFA

五种情况,两种基本的直接构造,三种复合的递归构造

子集构造算法 NFA-DFA

stack = []//遍历的结构
Q = []//所以的DFA状态,判重
D[,] = []//DFA结果
push( ε闭包(n0)) //将起始点做为q0
loop until stack==NULL
   q = pop() //状态弹栈
    loop every char:
        t = ε闭包(delta(q,c)) //1.根据转移函数得到NFA状态,求ε闭包
        D[q,c] = t//q状态通过c到t状态
        if(t not in Q)
            add(Q,t),push(t)
如果新状态有NFA的结束态,它就是结束态
//这里的t not in Q 为什额?
//因为构造的NFA比较特殊,往前的转移符号都是因为ε,而这个符号必然导致新生成的点有可能和之前的重复,所以不用加入

Hopcroft 最小化算法

节省空间,缩点缩边(图特别稀疏)

将所有点分为结束与非结束两个集合

loop until all sets not changes:

split(S)//对与同一集合内部的所有点,对同一字符转换至不同集合则就可以切分为若干集合

根据DFA生成代码

1. 转移表 与图论中的转移一样

2. 跳转表 根据每个状态对应的字符生成代码,这样省空间(图特别稀疏)

时间: 2024-08-01 17:02:32

词法分析学习的相关文章

词法分析学习-手工构词

这个是看MOOC学编译原理的一个作业. 识别标识符和关键字,核心在于转移图,dfa的构造 package bingone; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; /** * 手工构造词法分析器,标注的关键字有if for . * @author bingone * */ enum Token{ FOR("for"), IF(&quo

js 欺骗词法作用域

如果词法作用域完全由写代码期间函数所声明的位置来定义,怎样才能在运行时来"修改"(也可以说欺骗)词法作用域呢?    JavaScript 中有两种机制来实现这个目的.社区普遍认为在代码中使用这两种机制并不是什么好注意.但是关于它们的争论通常会忽略掉最重要的点:欺骗词法作用域会导致性能下降.在详细解释性能问题之前,先来看看这两种机制分别是什么原理 1.eval JavaScript 中的 eval(..) 函数可以接受一个字符串为参数,并将其中的内容视为好像在书写时就存在于程序中这个位

使用Scala基于词法单元的解析器定制EBNF范式文法解析

一.前言 近期在做Oracle迁移到Spark平台的项目上遇到了一些平台公式翻译为SparkSQL(on Hive)的需求,而Spark采用亲妈语言Scala进行开发.分析过大概需求过后,拟使用编译原理中的EBNF范式模式,进行基于词法的文法解析.于是拟采用传统的正则词法解析到EBNF文法解析的套路来实现,直到发现了StandardTokenParsers这个Scala基于词法单元的解析器类. 二.平台公式及翻译后的SparkSQL 平台公式的样子如下所示: 1 if(XX1_m001[D003

python实现算术表达式的词法语法语义分析(编译原理应用)

本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用户自定义变量. 词法分析,检查单词变量是否正确:语法分析,检查算术表达式语法是否正确并输出生成语法树:语义分析,输出四元表达式. 最终效果图: 例如输入: 词法分析结果: 语法分析结果: 语义分析结果: 算术表达式的组成语法如下: 无符号整数 = 〈数字〉{〈数字〉} 〈标识符〉= 〈字母〉{〈字母

你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域

在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是动态作用域, Javascript采用的是词法作用域, 关于动态作用域的有兴趣的可以自行Google. 1.词法阶段 首先我们要理解"词法阶段"这个词语,我们已经了解到Js存在一个编译阶段,编译阶段的第一步就是分词/词法分析,我们可以简称为"词法阶段" 简单来说,词法作

词法、语法与语义相关知识

概念 http://www.juweixin.com/t/detail/148383 语法到底是什么?有人说语法是语言里的法律.法规:有人说语法是框架结构:还有人说语法就是对前人语言习惯的一种总结.以上这些说法都对,但是又不全对. In linguistics, grammar is the set of structural rules governing the composition of clauses, phrases, and words in any given natural l

简单词法编译器

1.词法分析程序的功能: 词法分析器所输出单词符号常常表示成如下的二元式: (单词种别,单词符号的属性值) 单词种别通常用整数编码.标识符一般统归为一种.常数则宜按类型(整.实.布尔等)分种.关键字可将其全体视为一种.运算符可采用一符一种的方法.界符一般用一符一种的方法.对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息.单词符号的属性是指单词符号的特性或特征. 2.符号和种别码的对照表: 3.用文法描述词法规则: 程序设计语言中的几类单词可用下述规则描述: 1.增长的趋势

javascript基础语法——词法结构

× 目录 [1]java [2]定义 [3]大小写[4]保留字[5]注释[6]空白[7]分号 前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫:而说它复杂,是因为要真正掌握它则需要数年时间.实际上,前端工程师很大程度上就是指javascript工程师.前端入门容易精通难,说的是前端,更指的是javascript.本文是javascript基础语法的第一篇——词法结构 与java关系 关于javascript有这样一个说法,java和jav

javascript基础拾遗——词法作用域

本来是想写js面向对象笔记(二)关于封装的,但是在敲实例代码的时候,发现对作用域这个东西的概念有点模糊,翻阅了犀牛后,有点感觉了,就想着先记录下此时的感受. 之所以取名叫做词法作用域,是这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题. 1.由变量开始谈 习惯性先来段代码: 1 var x = "globol value";2 var getValue = fun