侧边栏壁纸
  • 累计撰写 793 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

词法分析

Dettan
2021-07-10 / 0 评论 / 0 点赞 / 160 阅读 / 389 字
温馨提示:
本文最后更新于 2022-07-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
实现
正则 :
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)”恢复 从剩余的输入中不断删除字符,直到词法分析器能够在 剩余输入的开头发现一个正确的字符为止
0

评论区