第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

ANLTR 4 (Java) 捕獲解析器錯(cuò)誤/預(yù)期以進(jìn)行測(cè)試

ANLTR 4 (Java) 捕獲解析器錯(cuò)誤/預(yù)期以進(jìn)行測(cè)試

白板的微信 2022-10-07 16:41:24
我正在研究 ANTLR-Parser,現(xiàn)在正在為解析器編寫測(cè)試。我已經(jīng)找到了一種“肯定”的方法——測(cè)試解析器,但現(xiàn)在還想測(cè)試解析器在輸入錯(cuò)誤時(shí)也會(huì)失?。ǚ穸y(cè)試?)。我想要的是一種使用 JUnits 的方法Assertions.assertThrows(),例如NoViableAltException解析器拋出的一個(gè)或任何其他異常。我已經(jīng)查看了ANTLRErrorListener及其實(shí)現(xiàn),但還沒有找到解決方案。到目前為止,這是我的測(cè)試用例:@Test    public void test_short_negative() {        String[] string_values = new String[]{"{", "<EOF>"};        int[] id_values = new int[]{MyLexer.CBRACKET_OPEN, MyLexer.EOF};        ArrayList<TestToken> tokens = new ArrayList<>();        for (int i = 0; i < id_values.length; i++) tokens.add(new TestToken(string_values[i], id_values[i]));        ListTokenSource source = new ListTokenSource(tokens);        for(TestToken t: tokens) t.setTokenSource(source);        TestErrorListener errorListener = new TestErrorListener(true);        MyParser pars = createParser(new ListTokenSource(tokens), errorListener);        pars.stmt_block();    }public class TestErrorListener extends BaseErrorListener {    private boolean hadError = false;    private TestToken lastOffendingSymbol;    private boolean doPrint;    public TestErrorListener(boolean doPrint){        this.doPrint = doPrint;    }    public boolean hadError() {        return hadError;    }    public TestToken getLastOffendingSymbol() {        return lastOffendingSymbol;    }    @Override    public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {        if(doPrint) System.out.println("Syntax error at " + line + ":" + charPositionInLine + ". Symbol: '" + ((TestToken) offendingSymbol).getText() + "' could not be parsed.");        hadError = true;        lastOffendingSymbol = (TestToken) offendingSymbol;    }    @Override    public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact, BitSet ambigAlts, ATNConfigSet configs) {        if(doPrint) System.out.println("Ambiguity found at [" + startIndex + ":" + stopIndex + "]!");    }}
查看完整描述

1 回答

?
UYOU

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是否拋出。


查看完整回答
反對(duì) 回復(fù) 2022-10-07
  • 1 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)