用于序列处理或解析的首选语言/技术

时间:2011-12-29 16:46:18

标签: java parsing

我过去曾经遇到过类似的问题,想知道用什么语言(方法)来解决类似问题(我是J2EE / java开发人员):

问题:在一组可能的单词中,使用给定的规则(比如单词可以是A和X的组合,并且始终以X开头,每个单词由空格分隔),您必须阅读一系列单词并通过输入解析以确定哪些单词在语法上是正确的。简而言之,这些涉及解析技术的问题。假设用Java模拟自动售货机的逻辑。

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

Google code jam problem

我们是否在Java中使用类似ANTLR或某些库的内容。

我知道这个问题略显通用,但我没有别的表达方式。

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

3 个答案:

答案 0 :(得分:2)

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

对于相对简单的解析和事件处理,我使用enum(s)作为状态机。 esp作为推送解析器。

对于非常简单的解析,你可以使用indexOf或split(“”)with equals,switch或startsWith

答案 1 :(得分:1)

如果您想模拟基本上是有限状态自动化的逻辑,您可以手动编写FSA代码。这是标准的计算机科学解决方案。一个不那么明显的方法是使用词法分析器生成器(它们有很多)从有效事件序列的描述中生成FSA(在词法生成器中说,这些被称为“字符”但你可以作弊并替换字符的事件发生。)

如果你有关于匹配的复杂递归规则,你需要一个更传统的解析器。 如果语法不复杂,您也可以手动编码;看我的?SO answer on "how to build a recursive descent parser"。如果您的语法很复杂或者变化很快,那么您将需要使用标准的解析器生成器。这里的其他答案提出具体的答案,但有很多可供选择,一般都很有能力。

[FWIW,我在1974年在May Company百货公司的TRW POS终端中应用解析器生成器来识别有效的交易序列。工作得很好。]

答案 2 :(得分:0)

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