我不喜欢有状态解析。在我看来,应该有更好的方法。 有吗?状态解析的替代方案
让我来举例说明。假设我正在解析一个文本文件(在这种情况下是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