2011-12-29 76 views
2

我过去几次遇到类似的问题,想知道用什么语言(方法论)来解决类似问题(我是J2EE/Java开发人员) :用于序列处理或解析的首选语言/技术

问题:出一个可能的组词,与给定规则的(说这个词可以是A和X的组合,并且总是以X开头,每个单词用空格分隔),你有阅读单词序列并通过输入解析以确定哪些单词在合成上是正确的。简而言之,这些是涉及解析技术的问题。说在Java中模拟自动售货机的逻辑。

所以我想知道什么是解决输入分析问题的技术/最佳方法。像谷歌代码果酱外星语言处理问题

Google code jam problem

难道我们使用类似ANTLR或一些Java库。

我知道这个问题稍微通用的,但我不得不表达它没有别的办法。

P.S:我不想要一个解决方案,我正在寻找解决此类问题的最佳方法。

回答

2

可以使用的JavaCC进行复杂的分析。

对于相对简单的解析和事件处理,我使用枚举(s)作为状态机。尤其是推式解析器。

对于非常简单的解析,您可以使用与等号,开关的indexOf或拆分(”“)或startsWith

+0

你谈论这样的做法:http://www.javacodegeeks.com/2011/07/java-secret-using-enum-to-build-state.html – Ayusman 2011-12-29 16:54:05

+0

自从我写,我也有心里。 ;)下半部分是使用枚举作为状态机的一个例子。 – 2011-12-29 16:57:57

+0

伟大的彼得.. +1,我也尝试在过去,却无法充分理解它。让我再尝试一次。 – Ayusman 2011-12-29 17:17:18

1

如果要模拟的东西,本质上是一个有限状态自动的逻辑,你可以简单地手工编码FSA。这是标准的计算机科学解决方案。一个不太明显的方式做到这一点是使用词法分析器发电机(有很多人),从事件的有效序列的描述产生的FSA(在词法分析器发电机讲,这些被称为“角色”,但你可以欺骗并将事件发生替换为字符)。

如果您有关于匹配复杂的递归规则,你会想要一个更传统的解析器。 可以用手,这些代码也一样,如果语法并不复杂;请参阅我的?SO answer on "how to build a recursive descent parser"。如果你的语法很复杂,或者它变化很快,你会想使用一个标准的解析器生成器。其他答案在这里提出具体的答案,但有很多可供选择的,通常都非常有能力。 [FWIW,我在1974年应用语法分析器生成器在May公司百货商店的TRW POS终端中识别有效的事务序列。工作得很好。]

0

你可以使用ANTLR这是很好的,它会帮助复杂的问题但你也可以使用正则表达式,例如:spilled(“\\ s +”)。