逐个读入,依据语言的词法规则)
词法分析是编译过程的第一阶段其任务是将源程序的字符流如C、Java等高级语言的源代码文本逐个读入依据语言的词法规则通常用正则表达式描述识别出一个个具有独立语法意义的最小单位——单词Token。每个Token通常包含三部分种别码token type如KEYWORD、IDENTIFIER、NUMBER、OPERATOR等、属性值attribute value如标识符的具体名字、数字的数值和行号/位置信息用于错误定位。例如对源代码片段if (x 10) y x 1;词法分析器会输出类似如下Token序列(KEYWORD, if) (LPAREN, () (IDENTIFIER, x) (EQUAL_EQUAL, ) (NUMBER, 10) (RPAREN, )) (IDENTIFIER, y) (ASSIGN, ) (IDENTIFIER, x) (PLUS, ) (NUMBER, 1) (SEMICOLON, ;)该过程通过有限自动机DFA或手工/自动生成的词法分析器如Lex/Flex实现核心目标是过滤空白符与注释、识别合法单词、报告非法字符或未定义符号如拼写错误的标识符或非法符号。在词法分析中区分关键字如if、while、int和用户自定义标识符的核心原则是关键字是预定义的、具有特殊语法含义的保留字其识别优先级高于普通标识符词法分析器通过查保留字表keyword table进行精确匹配且通常采用“最长匹配 保留字优先”策略。具体实现方式如下保留字表Keyword Table在词法分析器初始化时预先构建一个哈希表或有序列表存储所有语言的关键字及其对应种别码如if → KEYWORD_IF。当扫描到一个符合标识符规则的字符序列如字母/下划线开头、后接字母数字时先将其作为候选标识符完整读入遵循最长匹配原则再查表判断是否为关键字。匹配顺序与优先级词法分析器不会先假设它是标识符再“降级”为关键字而是在识别出一个合法标识符词素lexeme后立即查保留字表。若查表命中 → 输出对应关键字Token如(KEYWORD, if)若未命中 → 输出普通标识符Token如(IDENTIFIER, count)。✅ 这保证了关键字永远被优先识别避免用户误用关键字作变量名该错误通常由后续语义分析或语法分析阶段报错但词法分析已确保其被正确归类。设计约束保障区分语言规范要求关键字必须为保留字禁止用作标识符即语法上不允许int if 5;因此词法分析器只需做“存在性判断”无需上下文感知。标识符的词法规则如[a-zA-Z_][a-zA-Z0-9_]*与关键字字符串完全重叠故必须依赖查表——而非靠正则表达式单独匹配每个关键字否则正则会爆炸式增长。✅ 示例输入input若语言中input是关键字如某些脚本语言查表命中 → 输出KEYWORD_INPUT若非关键字如C语言中不是保留字查表失败 → 输出IDENTIFIER(input)。⚠️ 注意大小写敏感性需与语言一致如Java区分If和if后者是关键字前者是合法标识符。