C#词法分析器(七)总结

在之前的六篇文章中,我比较详细的介绍了与词法分析器相关的算法。它们都比较关注于实现的细节,感觉上可能比较凌乱,本篇就从整体上介绍一下如何定义词法分析器,以及如何实现自己的词法分析器。

第二节完整的介绍了如何定义词法分析器,可以当作一个词法分析器使用指南。如果不关心词法分析器的具体实现的话,可以只看第二节。

一、类库的改变

首先需要说明一下我对类库做的一些修改。词法分析部分的接口,与当初写《C# 词法分析器》系列时相比,已经发生了不小的改变,有必要做一下说明。

1. 词法单元的标识符

词法单元(token)最初的定义是一个 Token 结构,使用一个 int 属性作为词法单元的标识符,这也是很多词法分析器的通用做法。

但后来做语法分析的时候,感觉这样非常不方便。因为目前还不支持从定义文件生成词法分析器代码,只能在程序里面定义词法分析器。而 int 本身是不具有语义的,作为词法单元的标识符来使用,不但不方便还容易出错。

后来尝试过使用字符串作为标识符,虽然解决了语义的问题,但仍然容易出错,实现上也会复杂些(需要保存字符串字典)。

而既简单,又具有语义的解决方案,就是使用枚举了。枚举名称提供了语义,枚举值又可以转换为整数,而且还能够提供编译期检查,完全避免了拼写错误,所以现在的词法单元便定义为 Token<T> 类,与之相关的很多类也同样带上了泛型参数 T。

2. 命名空间

之前的命名空间是 Cyjb.Compiler 和 Cyjb.Compiler.Lexer,现在被改成了 Cyjb.Compilers 和 Cyjb.Compilers.Lexers,毕竟命名空间名称还是比较适合使用复数。

3. 词法分析器上下文

之前对词法分析器上下文的切换,可以使用上下文的索引、标签或 LexerContext 实例本身。但现在只能够通过标签进行切换,这样实现起来更简单些,使用上也不会受到过多影响。

4. DFA 的表示

原先 LexerRule 类中对 DFA 的表示有些简单粗暴,对于不了解具体实现的人来说,很难理解 DFA 的表示。现在重新规划了 LexerRule<T> 类中的接口,理解起来会更容易些。

二、定义词法分析器

这一节是 Cyjb.Compilers 类库中词法分析器的使用指南,包含了完整的文档、实例以及相关注意事项。类库的源码可以从 Cyjb.Compilers 项目找到,类库文档请参见 wiki。

1. 定义词法单元的标识符

前面说到,目前是使用枚举类型作为词法单元的标识符,这个枚举类型中的字段可以任意定义,没有任何限制。不过,为了方便之后的语法分析部分,特别要求枚举值必须是从 0 开始的整数,枚举值最好是连续的,因为不连续的枚举值会导致语法分析部分浪费更多的空间。

使用特殊的值 -1 来表示文件结束(EndOfFile),该值可以从 Token<T>.EndOfFile 字段得到,也可以通过 Token<T>.IsEndOfFile 属性获取词法单元是否表示文件结束。

这里仍然使用计算器作为示例,以下代码便定义了作为标识符的枚举:

在使用的时候,显然会比整数更加方便。

2. 定义词法分析器的上下文

词法分析器的所有定义都是从 Cyjb.Compilers.Grammar<T> 类开始的,因此首先需要实例化一个 Grammar<T> 类的实例:

词法分析器的上下文,可以用来控制规则是否生效。上下文有两种类型:包含型或者排除型。

如果当前是包含型上下文,那么会激活当前上下文的所有规则,同时会激活所有没有指定任何上下文的规则。

如果当前是排除型上下文,那么只会激活当前上下文的所有规则,其它任何规则都不会被激活。

使用以下的方法来分别定义排除型和包含型的词法分析器上下文,label 参数即为上下文的标签:

默认的词法分析器上下文是 "Initial",通过该标签可以切换到默认的上下文中。需要特别注意的是,由于实现上的原因,上下文必须先于所有终结符定义。

例如,以下的代码定义了一个包含型上下文 Inc,以及一个排除型上下文 Exc。

时间: 2024-08-30 05:05:39

C#词法分析器(七)总结的相关文章

七个保障Windows7操作系统安全的方法

  与Windows Vista相比,微软的Windows 7操作系统具有更强的安全性.如今对用户产生威胁的因素通常是由于恶意软件的攻击和用户缺乏保护意识造成的. 下面所列举的七种方法通过简单的安装设置就可以完成: 1.安装反病毒木马软件 对用户而言,威胁通常来自于木马.恶意软件.假冒的病毒扫描程序.不管你是计算机专家还是菜鸟,装备一款合适的杀毒软件是十分有必要的,同时记住保持杀毒软件的更新,防范新的恶意程序攻击. 2.开启IE8智能过滤功能 浏览器正逐渐成为最容易被攻击的目标,Windows

一张图看懂阿里云网络产品[七]共享流量包

共享流量包是BGP公网流量的预付费套餐,价格比后付费流量更低,并支持闲时峰谷流量包,能大大降低用户的BGP公网流量成本,是企业必备的省钱利器.本图将为各位全面讲解共享流量包产品. 系列文章持续更新中,敬请关注 [一]网络产品概览 [二]VPC [三]EIP [四]NAT网关 [五]负载均衡SLB [六]共享带宽 [七]共享流量包 [八]高速通道 [九]VPN网关 [十]云托付 [十一]全球加速

struct-C++primer第五版关于第七章类的一个问题

问题描述 C++primer第五版关于第七章类的一个问题 #include #include using namespace std; struct Sales_data{ Sales_data()=default; Sales_data(const string &s):bookNo(s){} Sales_data(const string &s,unsigned n,double p): bookNo(s),units_sold(n),revenue(p*n) {} Sales_dat

线程同步 卖票问题 三个车站卖七张票

问题描述 线程同步 卖票问题 三个车站卖七张票 正确的写法:public class mainclass { public static void main(String[] args) { Train A=new Train(); Train B=new Train(); Train C=new Train(); A.start(); B.start(); C.start(); } } class Train extends Thread{ public static int ticket=7

TCP/IP四层模型和OSI七层模型简介

表1-1是 TCP/IP四层模型和OSI七层模型对应表.我们把OSI七层网络模型和Linux TCP/IP四层概念模型对应,然后将各种网络协议归类. 表1-1  TCP/IP四层模型和OSI七层模型对应表 OSI七层网络模型 Linux TCP/IP四层概念模型 对应网络协议 应用层(Application) 应用层 TFTP, FTP, NFS, WAIS 表示层(Presentation) Telnet, Rlogin, SNMP, Gopher 会话层(Session) SMTP, DNS

[转贴]改好DEBUG七处缺点的comexe实现报告

 改好DEBUG七处缺点的comexe实现报告   首先声明,本文所指DEBUG,系DOS 6.22,win 98及2k三者DEBUG.EXE. (1) DEBUG命令T及P的2处缺点 跟踪命令T,建立在8086标志寄存器第8位(自陷位)置1后,处理器执行完一条 被跟踪指令,就进单步中断1的基础上(进入时,被调试进程栈顶3个字,被无辜破坏). DEBUG预先接管中断1,在那里,对被跟踪指令的执行完现场,先保存,后显示. 于是,DEBUG用以下5步,让欲跟踪的指令,在自陷位持有1的处理器环境下,间

七牛云存储-java+android 实现多张图片上传至七牛云上面???

问题描述 java+android 实现多张图片上传至七牛云上面??? 新手,刚入行,最近有个需求是要实现多张图片上传,上传至七牛云存储上面,查了一些,仅仅一些概念就理不清了,求能给个具体的实例,非常感谢... 解决方案 首先得到上传接口,剩下的就是遍历图片,一个个调用接口 解决方案二: 可以和七牛云的技术支持联系下,让他们派点工程师协助你们团队开发. 解决方案三: 多线程异步上传操作,很多第三方框架的... 解决方案四: 找七牛云技术支持,网上再找下很多多图片上传demo的 解决方案五: 额,

PS七种人物美白的快捷方法

下面将非常详细的介绍各种美白的方法,有的可能我们都很少见到.非常实用. 教程原图 最终效果 一.去色加图层模式法. 1.打开原图素材,把背景图层复制一层. 2.按Ctrl + Shift + U 去色. 3.图层混合模式改为"滤色",完成. 二.通道美白法. 1.打开原图素材. 2.按Ctrl + Alt + ~ 调出高光选区,新建一个图层,填充白色,完成. 三.蒙版美白. 1.打开原图素材,双击解锁. 2.新建一个图层填充白色,把白色图层拉到图层的最下面. 3.选择图片层,执行:图层

七种非常快捷的人物美白方法

七种非常快捷的人物美白方法 人物美白是图片处理中最为基础的部分,如果操作适当的话可以省去很多繁琐的操作.下面将非常详细的介绍各种美白的方法,有的可能我们都很少见到.非常实用. 原图 最终效果 一.去色加图层模式法. 1.打开原图素材,把背景图层复制一层. 2.按Ctrl + Shift + U 去色. 3.图层混合模式改为"滤色",完成.   二.通道美白法. 1.打开原图素材. 2.按Ctrl + Alt + ~ 调出高光选区,新建一个图层,填充白色,完成. 三.蒙版美白. 1.打开