C# 词法分析器(一)词法分析介绍

虽然文章的标题是词法分析,但首先还是要从编译原理说开来。编译原理应该很多人都听说过,虽 然不一定会有多么了解。

简单的说,编译原理就是研究如何进行编译——也就如何从代码(*.cs 文件)转换为计 算机可以执行的程序(*.exe 文件)。当然也有些语言如 JavaScript 是解释执行的,它的代码是直接 被执行的,不需要生成可执行程序。

编译过程是很复杂的,它涉及到很多步骤,直接拿《编译原理》(Compilers: Principles, Techniques and Tools,红龙书)上的图来看:

图 1 编译器的各个步骤,其实是我根据书上的图综合了一下后画的

这里给出了 7 个步骤(后面的优化步骤是可选的),其中前 4 个步骤是分析部分(也被称为前端 front end),是把源程序分解为多个组成要素,并在这些要素上加上语法结构,最后把信息存放在符 号表(symbol table)中。后三个步骤是综合部分(也成为后端 back end),它们根据中间表示和符 号表中的信息构造期待的目标程序。

将编译器分为这么多步骤,其好处就是使得每个步骤更加简单,从而使编译器更加容易设计,也可 以利用很多现有的工具——例如词法分析器可以用 Lex 或 Flex 生成,语法分析器可以用 Yacc 或 Bison 生成,几乎不用做太多编码工作就能得到一颗语法树,前端的工作也就完成的差不多了 。而至于后端,也有很多现有的技术可以使用,例如现成的虚拟机(CLR 或 Java,只要翻译成相应的 IL 就可以了)。

这个系列的文章,说的就是编译原理的第一步:语法分析。大部分算法和理论都来自《编译原理》 ,其余的部分则是自己搞出来的,或者是参考了 Flex 的实现(这里的 Flex 是指 fast lexical analyzer generator,一个著名的提供词法分析的程序,而不是 Adobe 的 Flex)。

我会尽量完整的介绍词法分析器的编写过程,包括一些细节的实现。当然,目前只能根据正则表达 式定义得到一个可以用来进行词法分析的对象,要想达到 Flex 那样直接根据词法定义文件生成词法分 析器源代码,还有很多工作要做,不是短期内能够搞定的。

本篇文章作为系列的第一篇,将会对词法分析做综合的概述,介绍一下其中用到的技术和大致的流 程。

一、词法分析介绍

词法分析(lexical analysis)或扫描(scanning)是编译器的第一个步骤。词法分析器读入组成 源程序的字符流,并且将它们组织成有意义的词素(lexeme)的序列,并对每个词素产生词法单元 (token)作为输出。

简单的来说,词法分析就是将源程序(可以认为是一个很长的字符串)读进来,并且“切 ”成小段(每一段就是一个词法单元 token),每个单元都是有具体的意义的,例如表示某个特 定的关键词,或者代表一个数字。而这个词法单元在源程序中对应的文本,就叫做“词素” 。

以计算器来举例,12+34*9 这一段“源程序”的词法分析过程如下所示:

图 2 算式的词法分析过程

时间: 2024-12-09 22:13:51

C# 词法分析器(一)词法分析介绍的相关文章

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

在之前的六篇文章中,我比较详细的介绍了与词法分析器相关的算法.它们都比较关注于实现的细节,感觉上可能比较凌乱,本篇就从整体上介绍一下如何定义词法分析器,以及如何实现自己的词法分析器. 第二节完整的介绍了如何定义词法分析器,可以当作一个词法分析器使用指南.如果不关心词法分析器的具体实现的话,可以只看第二节. 一.类库的改变 首先需要说明一下我对类库做的一些修改.词法分析部分的接口,与当初写<C# 词法分析器>系列时相比,已经发生了不小的改变,有必要做一下说明. 1. 词法单元的标识符 词法单元(

mixer:sql词法分析器设计

  介绍 mixer希望在proxy这层就提供自定义路由,sql黑名单,防止sql注入攻击等功能,而这些的基石就在于将用户发上来的sql语句进行解析.也就是我最头大的词法分析和语法分析. 到现在为止,我只是实现了一个比较简单的词法分析器,用以将sql语句分解成多个token.而对于从token在进行语法分析,构建sql的AST,我现在还真没啥经验(编译原理太差了),急需牛人帮忙. 所以,这里只是简单介绍一下mixer的词法分析. tokenize 在很多地方,我们都需要进行词法分析,通常会有几种

《编译与反编译技术》—第2章2.1节词法分析器的需求分析

本节书摘来自华章出版社<编译与反编译技术>一书中的第2章,第2.1节词法分析器的需求分析,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 第2章 词法分析的理论与实践 词法分析是编译过程的第一步,也是编译过程必不可少的步骤.编译过程中执行词法分析的程序称为词法分析器.本章主要介绍词法分析器的手动构造和自动构造的原理. 2.1 词法分析器的需求分析 本节首先介绍词法分析器的功能及其输出的单词符号的表示方式,然后研究将词法分析独立出来的原因.

《编译与反编译技术实战》——3.3 词法分析器的LEX实现

3.3 词法分析器的LEX实现 由于程序设计语言中的单词基本上都可用一组正规式来描述,因此,人们希望构造一个自动生成系统:对于一个给定的高级语言,只要给出用来描述其各类单词词法结构的一组正则表达式,以及识别各类单词时词法分析程序应采取的语义动作,该系统便可自动产生此语言的词法分析程序.1975年美国贝尔实验室的M. Lesk和Schmidt基于正规式与有限自动机的理论研究,用C语言研制了一个词法分析程序的自动生成工具LEX.对任何高级程序语言,用户只需用正规式描述该语言的各个词法类(这一描述称为

商品搜索引擎---分词(插件介绍与入门实例)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 最近刚好在学习搜索引擎分词,有了解一些分词插件,在这里给各位猿友分享一下. 本文主要介绍四个分词插件(ICTCLAS.IKAnalyzer.Ansj.Jcseg)和一种自己写算法实现的方式,以及一些词库的推荐. 一.ICTCLAS 1.1.介绍 中文词法分析是中文信息处理的基础与关键.中国科学院计算技术研究所在多年研究工作积累的基础上,研制出了汉语词法分析系统ICTCLAS

MySQL · 源码分析 · 词法分析及其性能优化

Table of Contents 1. 简介 2. 背景知识 3. 查找树的实现 3.1. 树的查找 3.2. 树的产生 4. 试试折半查找 5. 总结 简介 MySQL 支持标准的 SQL 语言,具体实现的时候必然要涉及到词法分析和语法分析.早期的程序可能会优先考虑手工实现词法分析和语法分析,现在大多数场合下都会采用工具来简化实现.MySQL.PostgreSQL 等采用 C/C++ 实现的开源数据库采用的是现代的 yacc/lex 组合,也就是 GNU bison/flex.其他比较流行的

《编译与反编译技术实战》——1.2节词法分析生成器LEX

1.2 词法分析生成器LEX 词法分析是编译过程的第一个阶段,其任务就是将输入的各种符号转化成相应的标识符号,转化后的标识符很容易被后续阶段处理. LEX是LEXical compiler的缩写,是UNIX环境下非常著名的工具,主要功能是生成一个词法分析器的C源码,描述规则采用正则表达式.描述词法分析器的文件*.l经过LEX编译后生成一个lex.yy.c的文件,然后由C编译器编译生成一个词法分析器. LEX接收用户输入的正则表达式,识别这些表达式并且将输入流转化为匹配这些表达式的字符串.在这些字

《编译与反编译技术实战》——1.2 词法分析生成器LEX

1.2 词法分析生成器LEX 词法分析是编译过程的第一个阶段,其任务就是将输入的各种符号转化成相应的标识符号,转化后的标识符很容易被后续阶段处理. LEX是LEXical compiler的缩写,是UNIX环境下非常著名的工具,主要功能是生成一个词法分析器的C源码,描述规则采用正则表达式.描述词法分析器的文件*.l经过LEX编译后生成一个lex.yy.c的文件,然后由C编译器编译生成一个词法分析器. LEX接收用户输入的正则表达式,识别这些表达式并且将输入流转化为匹配这些表达式的字符串.在这些字

介绍下XRuby项目

XRuby是什么?它是一个编译器.与其它编译器一样,它完成的工作是将一种格式的语言转换成另一种.与大多数编译器不同的是,它是将Ruby的代码(.rb)转换成Java的bytecode(.class). Xruby是一群中国开发者维护的项目,它的目的如上所述.它的主页是http://code.google.com/p/xruby/.与JRuby不同,JRuby一开始是想使用java写ruby解析器,性能上是个大问题,当然现在也走上了编译这条路.而XRuby是第一个实现这种想法的人. 我翻译下了<X