我正在编写解析器来解析包含UN EDIFACT代码列表的结构化文本文件。为此,我在C#中编写了一个通用状态机,我想用它来创建解析器。
我遇到的一个问题是如何正确匹配70个破折号序列?每次遇到破折号时我是否需要增加某种计数器,然后处理所需的任何动作?我无法找到解释如何做到这一点的任何地方。
这是我试图解析的文本文件的快照:
PART 5 UNITED NATIONS DIRECTORIES FOR ELECTRONIC DATA INTERCHANGE
FOR ADMINISTRATION, COMMERCE AND TRANSPORT
CHAPTER 6 Code list
1. Code list UNCL
Change indicators
a plus sign (+) for an addition
an asterisk (*) for an addition/subtraction/change to an entry
for a particular data element
a hash sign (#) for changes to names
a vertical bar (|) for changes to text for descriptions,
notes and functions
a letter X (X) for marked for deletion
Usage indicators
[B] = used in batch messages only
[I] = used in interactive messages only
[C] = common usage in both batch and interactive messages
----------------------------------------------------------------------
* 1001 Document name code [C]
Desc: Code specifying the document name.
Repr: an..3
1 Certificate of analysis
Certificate providing the values of an analysis.
2 Certificate of conformity
Certificate certifying the conformity to predefined
definitions.
答案 0 :(得分:1)
解析通常在两个不同的抽象层次上完成。在较低级别,词法解析器检测基本标记,如单词,数字,括号等。在更高级别上,语法分析器分析语法。语法分析与那些抽象标记一起使用,而不是单个字符。
词法解析器使用循环和计数器以简单,原始的方式工作。这就是我如何检测由破折号组成的分隔符。
状态机应该基于令牌并实现语法分析。
请参阅Compiler Construction - N. Wirth
上的Oberon Bibliography答案 1 :(得分:0)
NFA无法计算。为了表示重复的字符,您必须为每个字符引入一个状态:
╭───╮ - ╭───╮ - ╭───╮ ╭────╮
│ 0 │ ──────> │ 1 │ ──────> │ 2 │ ── ⋯ ──> │ 70 │
╰───╯ ╰───╯ ╰───╯ ╰────╯
...当然,您可以通过某种计数器变量来增强引擎。但它不再是DFA(或NFA)的直接表示。