解析器和状态机有什么区别?

时间:2016-03-02 05:40:03

标签: java scala parsing

我想编写一些解析电子邮件的代码,结构如下:

Message-ID: <2252971.1075852681795>
Date: Tue, 31 Jul 2001 05:56:08 -0700 (EST)
From: joebloggs@mail.net
To: jane@othermail.com, john@somemail.net
Subject: A subject goes here
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
X-From: Joe <joebloggs@mail.net>
X-To: Jane <jane@othermail.com>, John, Smith <john@somemail.net>
X-cc: 
X-bcc: 
X-Folder: \joebloggs\Inbox
X-Origin: Bloggs-J
X-FileName: joebloggs.pst

Hi, this is the information you were looking for...
Sincerely, 
Joe

我想编写一些代码,将其解析为(例如)内存类,然后我可以选择以某种CSV格式写入磁盘。请注意(例如)To:字段可以是多行的。

我想知道的是,我在这里看到的类型问题是什么?这是一个编写自定义解析器(并生成某种DSL)的示例,或者我最好将其建模为具有大外循环的状态机,某些状态和一些逐行解析输入的函数,取决于当前的状态?

语言我可以用Scala或Java编写它。

1 个答案:

答案 0 :(得分:3)

parser是一个软件组件,它接收输入数据(通常是文本)并构建数据结构。

Parser 并不总是状态机,但状态机是实现解析器的一种可能方式。

关于问题的第二部分。

scala和java有多个解析器库。最受欢迎的是Parboiledscala parser combinators(我个人更喜欢)。

此外,您可以使用regular expressions,这通常更快实现,并且更简单的方法来解析简单的东西(顺便说一下,内部的regexps是FSM)。

对于您的情况,我可能只使用正则表达式。您输入的结构看起来非常简单,因此只需将其拆分为多个部分,然后分别解析每个部分。