如何在NFA / DFA中表示重复字符

时间:2012-11-18 16:58:32

标签: c# state-machine

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

2 个答案:

答案 0 :(得分:1)

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

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

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

请参阅Compiler Construction - N. Wirth

上的Oberon Bibliography

答案 1 :(得分:0)

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

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

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