2013-06-05 55 views

回答

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); 
} 

然後在你的解析器,你可以得到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,處理更詳細的錯誤信息等。但所有這些都取決於你!