1.6错误处理

1.6.1 错误种类及处理对策

  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}