实现
正则 :
while|int|\(|\)|>|{|}|=|\|;|\d+|[a-z_A-Z][\w\d_]
((//.*?(\n|$))|(/\*.*?\*/))
([a-zA-Z_][a-zA-Z0-9_]*)
\d+
"(\\"|.)*?"
(\+\+|--|\+=|-\+|\*=|/=|&&|\|\||!=|==|>=|<=)
(\{|\}|\[|\]|\(|\)|\+|\-|\*|/|=|&|\||!|:|;|,|<|>|'|\"|\.)
(\b)
(//.*?(\n|$))|
(/\*.*?\*/)|
([a-zA-Z_][a-zA-Z0-9_]*)|
(\d+)|
("((\\")|.)*?")|
\+\+|--|\+=|-\+|\*=|/=|&&|\|\||!=|==|>=|<=|
\{|\}|\[|\]|\(|\)|\+|\-|\*|/|=|&|\||!|:|;|,|<|>|'|\"|\.
while(a>b){
int c = 10;
c = c*10;
}
每个都能匹配.
token:< 种别码,属性值 >
词法分析/扫描(Scanning)
单词类型 种别 种别码
1 关键字 program、if、else、then、… 一词一码
2 标识符 变量名、数组名、记录名、过程名、… 多词一码
3 常量 整型、浮点型、字符型、布尔型、… 一型一码
4 运算符
算术( + - * / ++ -- )
关系( > < == != >= <= )
逻辑( & | ~ )
一词一码
或
一型一码
5 界限符 ; ( ) = { } … 一词一码
例:词法分析后得到的token序列
输入 while(value!=100){num++;}
输出
1 while < WHILE , - >
2 ( < SLP , - >
3 value < IDN , value >
4 != < NE , - >
5 100 < CONST , 100 >
6 ) < SRP , - >
7 { < LP , - >
8 num < IDN , num >
9 ++ < INC , - >
10 ; < SEMI , - >
11 } < RP , - >
实现
用状态机实现
错误处理
如果当前状态与当前输入符号在转换表中对应信息为空且不是终止状态则为出错
处理
最简单的错误恢复策略:
“恐慌模式 (panic mode)”恢复
从剩余的输入中不断删除字符,直到词法分析器能够在
剩余输入的开头发现一个正确的字符为止
评论区