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):对于两个正则表达是M和N,用'|'表示可选,则M|N就是M或者N。
空字符串(epsilon):空字符串。
联合(concatenation):对于两个正则表达是M和N,用'-'表示可选,则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]+) 实数