我正在使用flex+野牛作为工具包开发一个简单的aql解析器。现在,我试图在语法错误发生时提供有用的反馈。我想向用户展示这样的想法:
Syntax error:
<line_index>: INSERT { name: "John Doe", 1123: 2, is_working: true } IN users
^^^^
字符串
我已经得到了语法错误发生的地方(行和列)的信息,但我真的想不出如何获取错误行。我尝试在 YY_USER_ACTION 宏中存储全局行缓冲区 current_line 并写入 yytext 的内容。这样:
#define YY_USER_ACTION \
strcpy(current_line+cl_length, yytext); \
for(int i = 0; yytext[i] != '\0'; i++) { \
if(yytext[i] == '\n') { \
memset(current_line, 0, cl_length);
cl_length = 0;
} else {
cl_length++;
}
}
}
型
但是我在行的开始处得到了重复的字符,因为词法分析Python类词法分析器作用域的使用开始条件。
有没有不同的方法来做它与flex宏或什么?
2条答案
按热度按时间y0u0uwnf1#
Lex不是面向行的,所以对于 line number 这样的概念没有提供任何明确的帮助。正则表达式运算符^,$混淆了两者的区别,但是你可以很容易地在扫描仪中使用这样的规则来处理行号:
字符串
这使得像
yywrap()
这样的东西很容易透明地将多个文件传送到lex scanner:型
可能还有其他的方法使用flex,它大大增强了lex。
wkftcu5l2#
将以下内容添加到您的Flex文件中。
字符串
这个选项指示flex生成一个扫描器,该扫描器在全局变量
yylineno
中维护从其输入读取的当前行号。这是一个未记录的
lex
变量,因此在指定%option lex-compat
时也会启用。NB如果您处理的是包含文件,则由用户来保存和恢复
yylineno
。