1 回答

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
還想測(cè)試解析器在提供錯(cuò)誤輸入時(shí)是否也會(huì)失敗
在這種情況下,您所說的“失敗”是什么意思尚不清楚,但我假設(shè)您的意思是“我怎么知道發(fā)生了語法錯(cuò)誤?”。因?yàn)?ANTLR 解析器可以從一些語法錯(cuò)誤中恢復(fù),所以跳過一些標(biāo)記并繼續(xù)解析。
每次遇到語法錯(cuò)誤時(shí),都會(huì)調(diào)用syntaxError()
your 的方法。TestErrorListener
根據(jù)您的示例代碼,hadError
每次發(fā)生錯(cuò)誤時(shí)都將標(biāo)志設(shè)置為 true,這意味著,在解析完成后,您可以測(cè)試該標(biāo)志是真還是假,與您的輸入令牌有關(guān)。
此外,您可以通過提供錯(cuò)誤處理程序使 ANTLR 立即拋出異常并在發(fā)生錯(cuò)誤時(shí)停止解析,即:
pars.setErrorHandler(new BailErrorStrategy());
從現(xiàn)在開始,您的解析器將拋出ParseCancellationException
. 抓住它并使用getCause()
方法,您可以獲得導(dǎo)致解析器停止的真正原因,包括NoViableAltException
.
在后一種情況下,您所要做的就是pars.stmt_block();
結(jié)合運(yùn)行assertThrows()
并檢查ParseCancellationException
是否拋出。
添加回答
舉報(bào)