1.6错误处理
1.6.1 错误种类及处理对策
- 行长度超过限制,本编译器设置为10000;遇到该错误时报错,且词法分析器立即停止运行
2. 标识符长度超过限制,本编译器设置为100;遇到该错误时报错,并对标识符进行截断处理,只取前100个字符,这可能会造成后续语义分析中出现重定义的错误
3. 非法字符,遇到该错误时报错并跳过该非法字符
4. 读取字符常量时遇到文件尾,遇到该错误时报错,且词法分析器立即停止运行
5. 读取的字符常量为空;遇到该错误时报错,并返回”\0”这一字符常量
6. 读取的字符常量不止一个字符;遇到该错误时报错,并提交第一个字符作为当前识别的字符常量
7. 读取字符常量时,先遇到了换行符而不是右单引号,也就是右单引号缺失的情况;遇到该错误时报错,如果之前没有识别任何字符,则返回”\0”,如果之前识别了字符,则返回第一个字符
8. 读取多行注释时遇到文件尾,也就是右花括号缺失的情况;遇到该错误时报错,且词法分析器立即停止运行1.6.2 错误信息格式设计
格式中,{变量}表示显示变量的值。1.6.2.1 普通错误信息格式
错误3、4、5、6、7、8均使用该错误信息格式。将如下表所示的信息
定义 | 描述 |
---|---|
string info | 具体错误信息描述 |
int l | 起始列 |
int r | 终止列 |
int yylineno | 行号 |
组织为:
第一行:[{info}] {yylineno}.{l}-{yylineno}.{r}
第二行:{lineBuffer}
第三行:在l位置到r位置之间输出”^”,l位置之间输出空格
这六种错误的info信息如下表所示:
错误编号 | 描述 | info |
---|---|---|
错误3 | 非法字符 | Invalid character! |
错误4 | 读取字符常量时遇到文件尾 | Unexpected end of file when reading a char constant |
错误5 | 读取的字符常量为空 | Char constant missing! |
错误6 | 读取的字符常量不止一个字符 | Too many characters in a char constant! |
错误7 | 读取字符常量时,先遇到了换行符而不是右单引号 | Right quote missing! |
错误8 | 读取多行注释时遇到文件尾 | Unexpected end of file when reading a multiple line comment, lacking of a right brace |
1.6.2.2 行超长错误格式
错误1使用该错误信息格式,将如下表所示的信息
定义 | 描述 |
---|---|
int l | 起始列 |
int r | 终止列 |
int yylineno | 行号 |
组织为:[Line length too large, exceed 10000] {yylineno}.{l}-{yylineno}.{r} Lex analyse abort!
1.6.2.3 标识符超长错误格式
错误2使用该错误信息格式,将如下表所示的信息
定义 | 描述 |
---|---|
int l | 起始列 |
int r | 终止列 |
int yylineno | 行号 |
组织为:[Identifier length too large, exceed 100] {yylineno}.{l}-{yylineno}.{r}