我不喜歡有狀態解析。在我看來,應該有更好的方法。 有嗎?狀態解析的替代方案
讓我來舉例說明。假設我正在解析一個文本文件(在這種情況下是YAML,但它可以是純文本或XML,我正在製作一個簡單的瑣事遊戲;我的遊戲將包含set
s的question
s,每個包含兩個或多個answer
。■在YAML,我可能會組織我的文件,如:
set:
name: math questions
question:
text: 1 + 1 = ?
answer: 3
answer: 4
best-answer: 2
question:
text: 2 * 3 = ?
answer: 5
best-answer: 6
set:
name: chemistry questions
question:
text: the valence of a Chlorine free radical is?
answer: 1
answer: 0
best-answer: -1
question:
text: Xeon is a noble gas
best-answer: true
answer: false
(我沒有用YAML一段時間,道歉,如果這是假YAML)。當我解析,如果我讀當前行看「的回答:......,」我知道,我在一組問題的回答
這往往是非常有狀態的代碼,例如:
if (currentLine starts with "answer")
currentQuestion.addAnswer(...)
else if (currentLine starts with "question")
currentQuestion = new question
...
在解析的任何一點,我們都需要對當前對象的引用,它可能嵌套在其他幾個對象中。問題的
部分可能是我的主循環迭代在每一行,一行行。另一種方法可能是閱讀該行,並根據其內容,根據需要再閱讀更多行。
如此反覆,我的問題:有解析數據的無狀態的方法是什麼?我有一種感覺,可能存在的方法比我在所有文本行上通常的有狀態循環更清晰,更易於閱讀/理解/編碼。
使用「Parser」monad可以被認爲是無狀態的。他們可以是令人心動的東西,但肯定值得一看。 – Enigmativity
@Enigmativity我不熟悉那些。你能分享一個鏈接嗎? – ashes999
這是一對[MSDN路徑](http://blogs.msdn.com/b/lukeh/archive/2007/08/19/monadic-parser-combinators-using-c-3-0.aspx)&[devhawk ](http://devhawk.net/2008/08/01/monadic-philosophy-part-4-the-parser-monad-in-f/) – Enigmativity