2017-04-12 64 views
0

我目前正在嘗試實現以文本電子表格作爲輸入(每個「單元」由選項卡分隔)的Antlr v4語法。語法支持引用其他單元格,包括在算術表達式中使用的引用。輸出與輸入相同,但所有表達式都已完成,每個引用都被引用的單元格的整數值替換。Antlr:引用尚未解析的數據

例輸入:

1 9 5 
    4 3 A3 
    =A2+C3 6 

輸出:

1 9 5 
    4 3 5 
    15 

我不確定如何實現我的Java應用程序分析器。由於單元格可能包含尚未分析過的單元格的引用,因此語法必須在計算表達式之前完成分析單元格。根據我的理解,語法訪問者可以在解析期間返回值,但無法評估包含對尚未解析的單元格的引用的表達式。

解決此問題的最佳方法是什麼?我能夠確定的唯一解決方案是將語法分成兩個更小的語法,一個解析單元格,另一個解析單元格內的表達式。但是,我寧願保持簡單,只需一個解析過程。

在一句話中,在Antlr4中,處理尚未解析數據的引用的最佳方法是什麼?

回答

3

在分析運行期間不需要評估表達式。分兩步完成整個過程:首先解析輸入以獲取分析樹,然後使用訪問者對其進行評估。在第一步之後,所有的單元都被分析到分析樹中,因此可以在評估步驟中解析。

+0

+1恕我直言,使用自己的模型進行評估總是一個好主意。而不是由antlr生成的* Context對象。 – Yevgeniy

+0

我第一次看這個答案時誤解了這個答案。在Antlr中究竟如何執行評估步驟?根據我的理解,訪問者進行深度優先遍歷。我需要的是細胞第一個寬度,然後深入細胞內的表達式 – bgregor

+0

如果您需要不同的步行策略,然後創建您自己的訪客類。 AbstractParseTreeVisitor中的所有內容都可以被覆蓋。實現'visitChildren()'方法的自己的變體。 –