如何获取错误的行和列号

时间:2013-06-05 09:22:07

标签: yacc

如何获取错误的行和列号(即字符串的哪一部分不遵循语法规则)? 我正在使用yacc解析器来检查语法。 谢谢。

1 个答案:

答案 0 :(得分:1)

你最好阅读dragon bookaho book解释并展示如何编写基于lex / yacc的编译器的示例。

为了获得错误的行/列,您应该让词法分析器保留列和行。所以在你的词法分析器中,你必须声明两个全局变量SourceLineSourceCol(当然你可以使用更好的非驼峰名称)。

在每个令牌生产中,您必须计算生成令牌的列,为此我使用宏如下:

#define Return(a, b, c)    \
{\
    SourceCol = (SourceCol + yyleng) * c; \
    DPRINT ("## Source line: %d, returned token: "a".\n", SourceLine); \
    return b; \
}

,使用该宏的令牌生成是:

"for" { Return("FOR", FOR, 1);

然后保留线条,对于每个生成新线条的标记,我正在使用:

{NEWLINES}     {
    BEGIN(INITIAL);
    SourceLine += yyleng;
    Return("LINE", LINE, 0);
}

然后在你的解析器中,如果你将它们声明为extern全局变量,你可以获得SourceColSourceLine

extern unsigned int SourceCol;
extern unsigned int SourceLine;

现在在你的parse_error语法制作中,你可以做到:

parse_error : LEXERROR
{ 
    printf("OMG! Your code sucks at line %u and col %u!", SourceLine, SourceCol); 
}

当然您可能想要添加yytext,处理更详细的错误消息等等。但这一切都取决于您!