`
NeuronR
  • 浏览: 59841 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

[词法分析]再见,正则表达式

阅读更多

对于用过Yacc、Javacc的人来说这个标题可能是不可思议的,难道不是先从词法分析入手?
其实我只是试图换个角度,用有穷自动机而不是正则式来实现词法分析。两者虽然在数学上是等价的,但是实现有很大不同。如果你跟我一样不太喜欢自己的实现被一大堆if-else或者switch-case弄得乱乱的,也许DFA是个不错的解决方案。

数据结构

/* const.h */
typedef enum {
    END, IDENT, ELSE, IF, WHILE, READ, WRITE, BREAK,
    INTEGER_TYPE, REAL_TYPE, INTEGER, REAL,
    PLUS, MINUS, MULTIPLY, DIVIDE, ASSIGN, LT, LE, EQ, NE, GT, GE,
    AND, OR, NOT,
    COMMA, EOS, LPARENT, RPARENT, LBRACKET, RBRACKET, LBRACE, RBRACE,
    SKIP, DENY
} AcceptType;

/* datastruct.h */
struct State {
    AcceptType type;
    struct State* nextState[1 << 8];
};

     上面那个枚举类型表征各种词法分析符号,如END表示文件结束,相当于读入了EOF,具体最后再列个表,现在将重要的。
    State结构体表示是DFA状态,每个状态有一个接受态,对应一个AcceptType;后面那个面目狰狞的数组,就是平时画在纸上的DFA状态到处指的箭头。比如有一个状态是这样的:

        /-\ 'x' /-\
        |a|---->|b|
        \-/     \-/

    那么对应的,写一个这样的语句来搞之:
    a.nextState['x'] = &b;
    如果是这样的:
        /------\
        |标识符 |-\ 数字
        \------/  | 字母
           ^      | 下划线
            \-----/

    那么用循环可以搞定之,伪代码如下:
int i;

for(i = 'a'; i <= 'z'; ++i) {

    标识符.nextState[i] = &标识符;

}

for(i = 'A'; i <= 'Z'; ++i) {

    标识符.nextState[i] = &标识符;

}

for(i = '0'; i <= '9'; ++i) {

    标识符.nextState[i] = &标识符;

}

 

这样一来自动机的构造与分析过程就完全分开了,在词法分析的时候就不需要把大量的判断、分支和状态转移堆积在一坨来写。当然,前提是状态们的初始化都正确完成。词法分析过程中会逐字节地读入字符(注意编码……),因此nextState数组的大小为(1 << 8)。具体下一篇文章再来讲。

 

附AcceptType枚举类型中各符号的意义:

END: 结束符

IDENT: 标识符

IF ELSE WHILE READ WRITE BREAK: 变成小写后,就是对应的关键字类型

INTEGER_TYPE REAL_TYPE: 对应于数据声明的类型关键字和int, real

INTEGER REAL: 整型常数和实型常数

PLUS MINUS MULTIPLY DIVIDE ASSIGN: 运算符号,依次是+-*/=

LT LE EQ NE GT GE: 比较符号,依次是小于<、小于等于<=、等于==、不等于!=、大于>、大于等于>=

AND OR NOT: 逻辑运算符,依次是与&&、或||、非!

COMMA: 逗号

EOS: 语句结尾,分号

LPARENT RPARENT LBRACKET RBRACKET LBRACE RBRACE: 各种括号,依次是()[]{}

SKIP: 可跳过的空格符,以及注释

DENY: 拒绝,接受类型为这个的都是非接受状态

分享到:
评论
3 楼 lwwin 2009-01-13  
我只想到了函数^^HOHO
考试加油^^~
2 楼 NeuronR 2009-01-12  
lwwin 写道

我记得你好像说不支持逗号表达式了呀……COMMA做什么用呢?

int i, j, k;

1 楼 lwwin 2009-01-12  
我记得你好像说不支持逗号表达式了呀……COMMA做什么用呢?

相关推荐

    bianyiyuanli.rar_DFA_lex 词法分析_正则表达式_词法分析_词法分析程序

    实验要求: ① 学习和理解正则表达式理论,写出C—语言的记号的完整的正则表达式;(适当使用正则定义) ② 学习和理解有限机理论,根据前面的正则表达式,用基于经验的方法画出C—语言的记的DFA图; ③ 用基于DFA图的算法...

    SQL 语法分析,正则表达式解析C#文件;正则表达式实现的语法分析引擎

    在IT领域,SQL语法分析和正则表达式是两种非常重要的技术,它们在处理和解析文本数据时起着至关重要的作用。SQL(Structured Query Language)是用于管理关系数据库的标准语言,而正则表达式则是匹配和操作字符串的...

    正则表达式+词法分析

    正则表达式与词法分析是编程语言处理过程中的两个重要概念,它们在软件开发、文本处理、数据验证等场景中发挥着至关重要的作用。 正则表达式(Regular Expression),简称regex,是一种模式匹配工具,用于在字符串...

    读书笔记:编译原理词法分析部分正则表达式生成DFA.zip

    读书笔记:编译原理词法分析部分正则表达式生成DFA

    编译程序原理与实现:第2章 词法分析&正则表达式.ppt

    编译程序原理与实现:第2章 词法分析&正则表达式.ppt

    词法分析器(正则表达式)

    设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

    正则表达式 到 nfa dfa

    正则表达式是一种强大的文本处理工具,用于匹配和操作字符串。它们在编程语言、文本编辑器和搜索引擎等众多领域有着广泛的应用。NFA(非确定性有限状态自动机)和DFA(确定性有限状态自动机)是计算理论中用于识别...

    正则表达式的词法分析程序

    (1)C++源代码扫描程序识别C++记号。 C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。 (2)打开一个C++源文件,打印出所有以上的记号。...

    词法分析器(从正则表达式到状态矩阵)

    在词法分析中,我们用正则表达式定义语言的各个部分,如标识符、关键字、运算符等。 接下来,我们将正则表达式转化为非确定性有限自动机(NFA)。NFA是一种有开始状态和结束状态的图,其中每个节点代表一种状态,每...

    编译原理及实现技术:2.词法分析___正则表达式.ppt

    本文将详细介绍词法分析以及与之紧密相关的技术——正则表达式。 ### 词法分析的角色与功能 词法分析器位于编译过程的最前端,其主要任务是读取源程序的字符序列,识别出程序中的基本语法单元,即“单词”,并生成...

    正则表达式转换为NFA

    这通常通过递归下降解析器或词法分析器完成。 2. **构造NFA状态**:每个正则运算符对应NFA的一个状态。例如,"."对应一个可以接受任何字符的状态,"*"则表示前一个状态可以重复零次或多次。 3. **建立转移关系**:...

    Sample语言编译器java实现__词法分析器(正则表达式)

    Sample语言编译器java实现__词法分析器(正则表达式方式)的源代码。写入token文件和符号表的文件路径记得打开源代码改哦!Sample语言规则详见编译原理实践教程(第2版)清华大学出版社。此代码纯本人一行一行编写,...

    java编写的正则表达式解析器

    词法分析将正则表达式分解为一个个“令牌”(如量词、字符类等),语法分析则构建抽象语法树(AST),表示正则表达式的结构。 5. **优化技巧**: - 避免使用过于复杂的正则表达式,它们可能会导致性能下降。 - 尽...

    编译原理正则表达式转NFA转DFA DFA最小化 Cpp代码

    编译原理课的大作业 包含三个小实验 在一个cpp文件里 正则表达式转换为nfa nfa转换为dfa dfa最小化 个人原创代码

    正则表达式与自动机的转换

    1. **词法分析**:在编译器设计中,正则表达式常用于定义语言的词汇结构,而自动机则用于识别这些结构。词法分析器(也称扫描器或分词器)通常基于自动机来高效地分割源代码。 2. **网络过滤**:在网络安全领域,...

    正则表达式素材4

    1. **词法分析**:将输入的正则表达式分解为一系列原子单元(如字符、量词、特殊符号等)。 2. **语法分析**:构建正则表达式的抽象语法树(AST),这有助于理解表达式的结构和逻辑。 3. **匹配引擎**:设计算法实现...

    编译原理及实现技术:5.词法分析__自动机与正则表达式、词法分析器的设计.ppt

    在词法分析的诸多概念中,自动机与正则表达式是其基石,而词法分析器的设计则是实现编译器的关键步骤之一。 自动机与正则表达式是紧密联系的两个概念。自动机是一种理论模型,可以用来识别某种语言(字符串的集合)...

    正则表达式转为NFA

    在给定的链接"http://blog.csdn.net/lileyear/article/details/7860596"中,作者lileyear讨论了他的自定义工具"blex",它可能是对flex工具的一种实现或扩展,用于将正则表达式转化为NFA以进行词法分析。 通过NFA,...

    DFA NFA 正则表达式转换

    项目中的代码提供了将正则表达式转化为NFA的算法,这对于理解正则表达式的工作原理和实现词法分析器非常有帮助。 此外,DFA最小化是一个优化过程,通过消除冗余状态,使DFA更加精简且易于理解。这个项目包含了一个...

Global site tag (gtag.js) - Google Analytics