2011-01-31 55 views
1

雖然寫在ML-法 我們需要寫來寫EOF函數 val eof = fn() => EOF; 代碼,這是一個必要組成部分來寫 另外,如果我想我的詞法停在檢測一個eof然後我應該添加到給定的函數。 謝謝。如何檢測EOF在ML-法

回答

2

Roger Price的User’s Guide to ML-Lex and ML-Yacc非常適合學習ml-lex和ml-yacc。

EOF函數是強制性的在lex定義的用戶聲明部分連同lexresult類型爲:

功能EOF由詞法分析器稱爲到達輸入 流的末尾時。

如果您的eof函數可以在您的應用程序或EOF標記適用時拋出異常。無論如何,它必須返回一些類型的lexresult。在用戶指南的第7.1.2章中有一個例子,如果EOF位於塊註釋的中間,它將打印一個字符串。

我用一個有些「簡單」 EOF功能

structure T = Tokens 
structure C = SourceData.Comments 

fun eof data = 
if C.depth data = 0 then 
    T.EOF (~1, ~1) 
else 
    fail (C.start data) "Unclosed comment" 

所在的C結構是一個「特殊」的評論處理結構纔是最重要開閉評論的數量。如果當前深度爲0,則返回EOF標記,其中(〜1,〜1)用於指示左側和右側位置。由於我不使用EOF的位置信息,我只是將它設置爲(〜1,〜1)。

通常情況下,您會設置%eop(解析結束)在yacc文件中使用EOF標記,以指示使用的是哪個永遠啓動的符號,可能後跟EOF標記。還請記住將EOF添加到%noshift。 Se節9.4.5中的%eop和%noshift。

顯然你必須定義你的yacc文件aswel的%term聲明中的EOF。

希望這會有所幫助,否則請看看用ml-lex和ml-yacc編寫的MLB parserSML parser。 MLB解析器是最簡單的,因此可能更易於理解。