天天看點

《ANTLR 4權威指南》——3.2節測試生成的文法分析器

本節書摘來自華章社群《antlr 4權威指南》一書中的第3章,第3.2節測試生成的文法分析器,作者[美] 特恩斯·帕爾(terence parr),更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.2 測試生成的文法分析器

對文法運作antlr之後,我們需要編譯自動生成的java源代碼。簡單起見,我們在工作目錄/tmp/array下完成所有的編譯操作。

《ANTLR 4權威指南》——3.2節測試生成的文法分析器

在輸入要測試的語句{99, 3, 451}之後,我們必須手動輸入一個eof。預設情況下,antlr在開始處理前會加載全部的輸入文本(這是最常見的情況,也是最有效率的處理方式)。

每行輸出代表一個詞法符号,其中包含該詞法符号的全部資訊。例如,[@5, 8:10 = '451', <4>, 1:8]表明它是第5個詞法符号(從0開始計數),由第8到第10個字元組成(從0開始計數,包含第8和第10),包含的文本是451,類型是4(int),位于輸入文本的第1行(從1開始計數)第8個字元(從0開始計數,tab作為一個字元)處。注意,輸出的結果中不包含空格和換行符,這是因為在我們的文法中,ws規則的“->skip”指令将它們丢棄了。

如果需要文法分析器關于輸入文本識别過程的更多資訊,我們可以使用“-tree”選項檢視文法分析樹:

《ANTLR 4權威指南》——3.2節測試生成的文法分析器

用自然語言表述,文法分析樹就是,“輸入的是一個由一對花括号包裹的三個值組成的初始化語句,第一個和第三個值是整數1和4,第二個值也是一個初始化語句,它由一對花括号包裹的兩個值組成,這兩個值是整數2和3”。

這些内部節點,即init節點和value節點,非常通俗易懂,因為它們用名字辨別出了複雜的輸入元素。這有點像是辨別英語句子中的動詞和主語。antlr最棒的部分在于,它能夠基于我們的文法中的規則名自動建立這樣的一棵文法分析樹。在本章的最後,我們會使用antlr内置的文法分析樹周遊器觸發自定義的回調函數enterinit()和entervalue(),進而建構出一個滿足要求的翻譯器。

現在我們已經能用antlr分析文法、生成代碼,并且測試它們了,接下來我們要思考的是,如何從另外一個java程式中調用生成的文法分析器。

繼續閱讀