1
如何獲取錯誤的行號和列號(即哪部分字符串不符合語法規則)? 我正在使用yacc解析器來檢查語法。 謝謝。如何獲取錯誤的行號和列號
如何獲取錯誤的行號和列號(即哪部分字符串不符合語法規則)? 我正在使用yacc解析器來檢查語法。 謝謝。如何獲取錯誤的行號和列號
您最好閱讀dragon book和aho book,它們解釋並顯示如何編寫基於lex/yacc的編譯器的示例。
爲了獲得錯誤的行/列,您應該讓您的詞法分析器保留列和行。因此,在您的詞法分析器中,您必須聲明兩個全局變量,SourceLine
和SourceCol
(當然,您可以使用更好的非駱駝名稱)。
在每個令牌生產中,您要計算所產生的令牌的列中,用於該目的我使用宏如下:
#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);
}
然後在你的解析器,你可以得到SourceCol
和SourceLine
如果聲明這些爲外部全局:
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
,處理更詳細的錯誤信息等。但所有這些都取決於你!