4

ucc编译器(词法分析)

 3 years ago
source link: https://feixiaoxing.blog.csdn.net/article/details/118053655
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ucc编译器(词法分析)

费晓行 2021-06-19 15:06:29 51
分类专栏: ucc编译器

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

    学过编译器的同学都知道,词法分析是编译器里面最基础的一条。之前,在学校读书的时候,老师也会告诉我们这个时候,应该用状态机来实现。此外,必须要先要做一遍词法分析,然后才能做语法分析,其实不然。至少,我们今天的ucc里面,其实语法分析和词法分析是一起做的。

    另外一点,和学校里面不一样的是,很多场合,大家也喜欢用flex工具自动生成词法分析的代码。毕竟,只要会写正则表达式,就可以完成很多的工作。这个比手写容易很多。

1、词法分析的文件

lex.c

https://github.com/nobled/ucc/blob/master/ucl/lex.c

2、给语法解析提供的接口

3、注册词法分析回调函数

void SetupLexer(void)

4、解析回调注册

5、举例说明

5.1 一般的符号解析,比如加号解析

    注意这里的加号解析,它有可能是+,有可能是++,也有可能是+=,其实有三种情况需要处理。不失一般性,我们可以找到减号的解析函数,

    加号要比加号复杂一点,除了-,它还有可能是--,-=,->,所以总共有四种情况。

5.2 有些符号,因为实在不可能出现其他情况,根本不需要往后看,比如[、]、{、}等等,因此对它们的处理其实直接可以用macro宏来表示,

5.3 对变量的解析

    注意,对变量的解析这部分,还会进一步分成单字符、字符串、关键字、普通变量四种情况的解析。因此,它的结果可能有四种形式。

5.4 对数字的解析

    对数字的解析比较复杂,这个里面有可能是整数,也有可能是浮点数。整数里面还有10进制、16进制,浮点数里面有单精度和双精度。当然,不管结果是什么,都不外乎这两种情形。

5.5 其他支撑函数

    这部分函数也有一些,比如检查是否是数字或字母,是否是关键字,是否跳过空格等等。这部分函数也非常关键,但是他们不是主要的接口函数。

    记得读书的时候,这部分考虑的主要就是状态机的部分,也就是fsm。只要有一些fsm的基础知识,用起来还是比较容易地。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK