在运行时创建DFA。有多少州?

时间:2017-05-10 09:12:53

标签: c++ dfa

我目前正在开发一个程序,该程序将对语言进行英语描述,然后使用说明为这些规范创建DFA。我允许某些操作,例如{w | w在开头有子串01}和其他选项,如偶数奇数子串,比k子串更少或更精确等。用户也选择字母。

我的问题是我怎么知道我需要多少个州?因为用户给了我我的字母和规则,直到运行时我才知道。我以前创建了DFA的/转换表,但在这些情况下,我知道我的DFA是什么,可以在类中声明它还是静态的。我应该使用5个傻瓜(Q,Σ,δ,q0,F)吗?或采取不同的方法?任何帮助我的头围绕问题的人都表示赞赏。

1 个答案:

答案 0 :(得分:0)

  

我的问题是我怎么知道我需要多少个州?

你不会。

您可以将转换函数表示为std::unordered_map对(q,σ)∈(Q,Σ)到q∈Q

using state = int;
using symbol = char;
using tranFn = std::unordered_map<std::pair<state, symbol>, state>;

// sets up transition function, the values can be read at runtime
tranFn fn;
fn[{0, 'a'}] = 1;
fn[{0, 'b'}] = 2;
fn[{1, 'a'}] = 1;
fn[{1, 'b'}] = 0;
fn[{2, 'a'}] = 2;
fn[{2, 'b'}] = 2;

// run the dfa
state s = 0;
symbol sym;
while(std::cin >> sym)
    s = fn[{s, sym}];
std::cout << s;

顺便说一句,如果1是上面dfa中的接受状态,则它接受一个(a + ba)*