3

让我想编程的第一件事就是创建一个多人文本游戏。当我意识到,至少在当时对我来说,编写一个智能解析器是多么复杂时,我被这个想法吓跑了。

所以现在我又开始思考这个问题了,我已经尝试对这个主题进行大量研究。事实证明,它似乎比我想象的要复杂得多,而且我偶然发现了诸如lexingtokenizingparsing之类的术语,我以前只知道后者。我认为词法分析领域是我想要寻找的。

因此,与其尝试创建我自己的词法分析器和解析器,我认为它们非常困难且容易出错,并且大多数人都指示要避开,我想我会找到一个好的词法分析器和解析器生成器来使用,这应该会做对我来说所有繁重的工作,我可以专注于我想要的语法。我也听到很多人说想要做这样的事情的人应该简单地使用Inform.

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

一段时间以来,我一直在尝试为 C# 寻找一个好的词法分析器/解析器生成器,但对人们给出的评论似乎提供的一切并不满意。

C# 的 antlr 似乎不发达,而且大多是事后才想到的。我已经尝试理解 GPLEX 和 GPPG,但到目前为止,尽管阅读了很多文档并尝试阅读很多关于词法分析的内容,但它们现在对我来说太混乱了。

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

我想用名词短语和动词短语构建一个简单的英语语法,并且能够在游戏开发和扩展时从数据库中动态添加和准备好名词和动词列表。

我想我觉得我对我一直在尝试做的这个主题的研究结果缺乏信心。

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

4

2 回答 2

10

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

回答您的问题:我同意 tallseth;这取决于你想在这里提高什么技能。人们偶尔会问我为什么不造一艘船,因为我相当得心应手,喜欢航海。因为如果你喜欢在你的车库里有一艘未完工的船两年,你应该只建造一艘船。如果你想扬帆,就扬帆远航。如果你想造一艘船,那就造一艘船。但是不要因为你想航行而造船。想写文字冒险,就学Inform7;它是世界上最棒的文字冒险工具。如果您想学习如何制作词法分析器和解析器,请不要乱用解析器生成器。制作词法分析器和解析器

如果您正在对一种新的编程语言进行原型设计并且想要快速上手,那么解析器生成器非常有用。但是编程语言语法可以具有非常好的特性,使它们能够以自然语言不具备的方式自动生成解析器。如果您使用解析器生成器方法,您可能会花费与构建语法所花费的时间一样多的时间与解析器生成器进行斗争。

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

简而言之,我强烈鼓励你跟随你的直觉;编写自己的词法分析器和解析器非常有趣,如果您从小处着手并逐步发展,实际上并不难。

于 2013-01-26T16:51:15.930 回答
3

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

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

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

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

于 2013-01-26T14:43:04.033 回答