0

我正在编写一个解析器来解析一个包含 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.
4

2 回答 2

1

解析通常在两个不同的抽象级别上完成。在较低级别上,词法解析器检测基本标记,如单词、数字、括号等。在更高层次上,句法解析器分析句法。句法分析适用于那些抽象标记,而不是查看单个字符。

词法解析器以简单、原始的方式工作,例如使用循环和计数器。这就是我如何检测由破折号组成的分隔符。

状态机应该基于令牌并实现句法分析。

请参阅Oberon 书目中的编译器构造 - N. Wirth

于 2012-11-18T17:51:08.240 回答
0

NFA 无法计算。为了表示重复字符,您必须为每个字符引入一种状态:

╭───╮    -    ╭───╮    -    ╭───╮          ╭────╮
│ 0 │ ──────> │ 1 │ ──────> │ 2 │ ── ⋯ ──> │ 70 │
╰───╯         ╰───╯         ╰───╯          ╰────╯

…当然,您可以通过某种计数器变量来增强引擎。但是,它不再是 DFA(或 NFA)的直接表示。

于 2012-11-18T17:50:14.920 回答