手工打造编译器之词法分析1

1 词法分析

(也想过用flex等等,下载了,用cygwin安装了,但是我是微软操作系统,不知道怎样掉它的接口,

所以就算了。然后仔细想想,写出来一个很简单的,复杂在正则表达式,墨迹了两三个礼拜还是墨迹

出来了,那就自己写吧。。。)

将输入分解为一个个单独的词法符号。

这些符号包括:

Tiger语言的保留字while,for, to, break,let,in,end,function,var,type,array,if,

then,else,do,of,nil

Tiger语言使用的符号

, : ;( ) [ ] { } . + - * / = <> < > <= >= & | :=

要识别的还有标志符,数字,实数

 

1.1  那么分解过程为

Step 1:是符号吗?如果是返回,否则继续到step 2

Step 2: 是保留字吗?如果是返回,否则继续到step 3

Step 3:是标志符,数字,实数吗?如果是返回,否则为error.

Step 1,简单,一个一个符号比较就行。

Step 2,对于Tiger语言的保留字,用键树(Key tree)。键树采用孩子兄弟的存储方法。

Step 3,用正则表达式来处理。

1.2  正则表达式

1.2.1  正则表达式的基本元素

符号(symbol):特殊含义字符除外,代表字符本身。

可选(alternation):对于两个正则表达是MN,用'|'表示可选,则M|N就是M或者N。

空字符串(epsilon):空字符串。

联合(concatenation):对于两个正则表达是MN,用'-'表示可选,则M-N就是M和N。

重复(repletion):对于正则表达是M,用'*'表示重复,则M*就是零个或任意多个M

用这些基本元素可以表示任意正则表达式。

1.2.2  扩展的字符:

'[ '和']',在'[ ',']'内部的元素都是可选的关系。

.',代表任意字符

?,代表0次或1

+ ',代表1次或多次

'(',为了调整优先级

') ',为了调整优先级

/ ,转义,讲特殊字符转化为普通字符。

1.3  非法正则表达式

1.3.1  以下是合法正则表达式

[3-.jj]

[]

[092kjhsA-C]

a|0

ab

a(39)

(0|1)*.0

[0-9]

[[[[""]

(0|1)*.0

[a-z][a-z0-9]*

[0-9]+

([0-9]+/.[0-9]*)|([0-9]*/.[0-9]+)

.|iio

(20p)[]

 

1.3.2  以下为非法正则表达式

-a

a-

a+-a

+-a

a-[

2|+

78a/b

|{90*

[0-9]|

+|a

a+|a

abc[2-=]|[

/6

a*+

[()""[]/]/

/+-/-

1.4 典型的正则表达式

[_a-zA-Z][_a-zA-Z0-9]*   标识符

[0-9]* 整数

([0-9]+/.[0-9]*)|([0-9]*/.[0-9]+) 实数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值