C语言 我如何获取flex/lex当前正在词法分析的行,以便在yyerror中使用它?

ac1kyiln  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(100)

我正在使用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宏或什么?

y0u0uwnf

y0u0uwnf1#

Lex不是面向行的,所以对于 line number 这样的概念没有提供任何明确的帮助。正则表达式运算符^,$混淆了两者的区别,但是你可以很容易地在扫描仪中使用这样的规则来处理行号:

\n { my_lineno++; }

字符串
这使得像yywrap()这样的东西很容易透明地将多个文件传送到lex scanner:

extern char *files[];
extern int  nfiles;
extern int  my_lineno;
int yywrap() {
   static int curfile = 0
   static FILE *lastfile = NULL;
   FILE *fp = NULL;
   if (lastfile) {
       fclose(lastfile);
   }
   while (curfile < nfiles && fp == NULL) {
       fp = fopen(files[curfile++], "r");
   }
   yyin = lastfile = fp;
   my_lineno = 0; 
   return fp == NULL;
}


可能还有其他的方法使用flex,它大大增强了lex。

wkftcu5l

wkftcu5l2#

将以下内容添加到您的Flex文件中。

%option yylineno

字符串
这个选项指示flex生成一个扫描器,该扫描器在全局变量yylineno中维护从其输入读取的当前行号。
这是一个未记录的lex变量,因此在指定%option lex-compat时也会启用。

NB如果您处理的是包含文件,则由用户来保存和恢复yylineno

相关问题