对于我应该采用泥浆/交互式小说解析器的方法感到困惑

时间:2013-01-26 12:22:17

标签: c# .net parsing lex

让我想要编程的第一件事就是创建一个多人文本游戏。当我意识到,至少在我看来,写一个智能解析器会有多复杂的时候,我很害怕这个概念。

所以现在我回过头来思考它,并且我试图对这个问题进行大量的研究。事实证明它似乎比我想象的要多得多,而且我偶然发现了诸如 lexing 标记化解析之类的术语>,只有我之前知道的后者。我认为词法分析的领域是我想要寻找的。

因此,我没有尝试创建我自己的词法分析器和解析器,而这些词法分析器和读取器非常困难且容易出错,并且大多数人都指示远离它,我想我会找到一个好的词法分析器和解析器生成器来使用哪个我认为应该为我做所有繁重的工作,我可以专注于我想要的语法。我也听过很多人说过想做这种事的人应该只使用Inform

当然,我觉得Inform很酷,但C#是我选择的语言,我喜欢它让我对自己认为的Inform提供的自由。我对创建多人文本游戏的所有组件和框架比在任何一个特定的最终结果中更感兴趣,所以我喜欢最好使用标准编程语言的想法。

我一直在努力为C#找到一个好的词法分析器/解析器生成器,但是对于人们给出的评论而言似乎并不满意。

C#的antlr似乎不发达,大多是事后的想法。 我已经尝试过了解GPLEX和GPPG但是现在它们对我来说太混乱了,尽管阅读了很多文档并试图阅读很多关于lexing的内容。

我脑子里有很多关于lexing的整个过程的概念,但是当面对词法分析器和解析器时,我想我真的不知道这些应该如何被嵌入到我的实际代码中。

我想用名词短语和动词短语构建一个简单的英语语法,并且能够创建名词和动词列表,这些名词和动词可以随着游戏的开发和扩展而从数据库中动态添加和准备。

我想我觉得我对这个问题的研究结果很不满意。

老实说,基于我所研究的内容创建我自己的词法分析器和解析器的概念的想法在这一点上比使用我读过的任何词法分析器/解析器生成器更有吸引力。

2 个答案:

答案 0 :(得分:10)

首先,一些元建议。对于StackOverflow而言,这可能不是一个很好的问题,因为它不是特定的技术问题。您可以考虑在Programmers.StackExchange.com上提出类似的问题。

解决你的问题:我同意这个问题;这取决于你想在这里改进的技能。人们偶尔会问我为什么不建造船只,因为我相当方便,喜欢航行。因为如果你想在你的车库里放一艘未完成的船两年,你应该只建造一艘船。如果你想帆,帆。如果你想建造一艘船,建造一艘船。但是不要因为想要航行而建造一艘船。如果你想写文字冒险,学习Inform7;它是制作世界上见过的文字冒险的最令人难以置信的绝佳工具。如果你想学习如何制作词法分析器和解析器,那么不要乱用解析器生成器。 制作词法分析器和解析器

如果您正在使用新的编程语言进行原型设计并希望快速开始,那么解析器生成器非常棒。但是编程语言语法可以具有非常好的属性,使得它们能够以自然语言不能自动生成解析器的方式生成。如果你使用解析器生成器方法,你可能花费尽可能多的时间与解析器生成器争用,而不是花费在构建语法上。

由于你是初学者,我建议你概括一下文本冒险的历史。首先编写一个可以解析双字命令的词法分析器和解析器:“go north”,“get sword”,“drop brick”等等。这将为您提供足够的灵活性,然后您可以开始解决文本冒险设计中的其他问题:如何表示对象和位置。从小开始;如果你可以制作一个两个房间的游戏,玩家可以拿起并放下物品,那么你就可以了。

简而言之,我强烈建议您遵循自己的直觉;写你自己的词法分析器和解析器是非常有趣的,如果你从小处着手并且努力工作,那就不那么难了。

答案 1 :(得分:3)

这取决于你想要从项目中获得什么。

如果这是一个空余时间的学习项目,那么滚动自己的标记器和解释器是一个很好的解决方案。虽然很难完美地做到这一点,但是制作足够的解析层相当容易。我建议你可以开始使用最小的解析层,并在为游戏添加丰富性时逐步改进它。如果您感兴趣,这是练习TDD和设计模式的一个很好的问题。使用这些实践可以更容易地逐步改进。

另一方面,如果你不会从这个练习中获得很多价值(你的时间紧迫,这是真正的工作,你只是不关心解析层等),然后我建议使用现有的解析器。如果您将第三方解析器封装在抽象之后,您可以稍后改变主意,编写自己的解析器或使用什么解析器。

你可能已经看过了,但是this SO question看起来有一个很好的c#解析器列表。