高级Flex与Bison:错误处理与纯扫描器和解析器
1. 精确错误报告
在解析过程中,精确报告错误的行号和列号是很重要的。可以手动重新扫描标记以检查换行符,并将yycolumn设置为换行符后的字符数,这样就能准确报告错误位置。即使不需要每个标记和规则的精确列号,在Bison解析器中使用位置信息也很有必要。
1.1 包含文件名的更复杂位置信息
大多数解析器可以处理多个输入文件。要在位置数据中包含文件名并不难,具体操作如下:
1. 定义自己的YYLTYPE,其中包含一个指向文件名的指针。
2. 重新定义解析器宏YYLLOC_DEFAULT,用于在解析器归约规则时合并位置信息。
3. 修改词法分析器中YY_USER_ACTION的代码,将文件名放入每个标记的yylloc中。
4. 做一些其他小的更改以记住解析器正在读取的文件名。
以下是相关代码示例:
%code requires { char *filename; /* current filename here for the lexer */ typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; char *