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

标签 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..

最佳答案

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

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

关于你问题的第二部分。

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

您也可以使用 regular expressions ,这通常可以更快地实现并且更容易解析一些简单的东西(顺便说一句,正则表达式在内部是 FSM)。

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

关于java - 解析器和状态机有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35739336/

相关文章:

java - 如何从 recyclerview 适配器中消除对话框 fragment

java - 从 Telephony Manager 获取电话类型信息

ScalaFX 如何创建一个方法来响应 var (ObjectProperty) 中的变化?

scala - 我如何处理 Scala 中的 Hashtable 空值?

java - 使用 DocumentListener 替换

java - 填充微调器时 dataAdapter 显示为 null 但它包含值

java - scala 和 java 枚举之间的区别

Java XPath - 查找前缀为的标签

python - Python 程序如何加载并读取文件中的特定行?

ruby - == 和大小写的区别?