YACC 只是一個語法分析器,它需要一個詞法分析器對其進行分析的。如果你想要用 yacc 進行語法分析,除了 yacc 自己之外,還需要如下幾個函數:
1. int yylex();
這個函數提供的是語法分析器,它的返回值必須是一個 token,也就是 %token 定義的那些非終結符對應的編號(由 yacc 生成,并輸出到 y.tab.h 里,使用的時候記得在 yylex() 函數的實現文件中包含 y.tab.h)。
2. int yyerror(const char* msg);
這個函數負責在發現語法錯誤的時候打印錯誤信息,它的形式說明了一切,我就不多說了。
3. int yywrap();
這個函數通常是在你使用 flex 生成詞法分析器的時候需要提供的,我記得是用來給 flex 設置調試信息的開關。如果其返回真值則關閉調試信息,反之,如果返回假值則打開調試信息。如果你是用自己寫的 yylex(),那么這個函數就不需要了。
另外需要注意的是,上面三個函數中的 yy 前綴實際上是與 yacc 中的 yyparse()等函數的前綴保持一致的。如果你在命令行上使用 -p 選項把 yy 前綴給改了(比如說,xx),那么以上三個函數的前綴也要改掉(xxlex()、xxerror()、xxwrap())。
如果你打算寫一個語法分析器,并且其詞法非常復雜,那么最好使用 flex 和 yacc 搭配,用 flex 處理詞法問題(雖然 flex 2.5.4 生成的代碼好象有一個內存泄漏錯誤,不過不妨事)。如果詞法很簡單,那么可以自己寫 yylex() 處理詞法分析。關于 yylex() 的規范嘛,請參考 flex 文檔。