正规式与有限自动机之间的转换

ab 串行关系 在中间添加一个状态

s3   到了s3状态 也就相当于到了 终态



例题1



下划线     a代表字母集  d代表数字集


该式代表编程时 字符集的定义




例题2



q0既是初态也是终态 (终态 双圈)-->可以使空串 ( 进入初态直接终态)现在ABCD都是闭包  还不能排除选项


得到的串 有可能 全0                       000000000000000000000000000                000000(0|1)0

                                                         00000000000000    10   00000000

                                                         101010101010...................................

 0是离散的     但每输入一个1后面就要一个0

A答案表达不出10101010............排除

C答案 ((0|1)0)*  有局限性  产生00   10     产生不出0100的串

D答案表达不出00000100000000               如果是  (0*(10)*)*就可以

故选b








  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,需要一定的计算机理论基础。我会尽可能简单地解释一下。 正规文法与有限自动机是两种描述形式语言的方式。正规文法是一种用于描述正则语言的形式化语法,而有限自动机是一种用于识别正则语言的自动机。 正规文法可以转换有限自动机,这个过程叫做正规文法到NFA的转换。具体步骤如下: 1. 将正规文法转换为正则表达式。 2. 将正则表达式转换为NFA。 下面是一个简单的C++代码实现: ```c++ #include <iostream> #include <stack> #include <vector> #include <string> using namespace std; // 定义状态节点 struct State { int id; bool is_final; vector<pair<char, State*>> transitions; }; // 定义NFA class NFA { public: NFA(State* start, State* end) : start(start), end(end) {} State* start; State* end; }; // 定义正则表达式节点 struct RegexNode { char c; RegexNode* left; RegexNode* right; RegexNode(char c) : c(c), left(nullptr), right(nullptr) {} RegexNode(char c, RegexNode* left, RegexNode* right) : c(c), left(left), right(right) {} }; // 将正规文法转换为正则表达式 RegexNode* grammarToRegex(string grammar) { stack<RegexNode*> s; for (char c : grammar) { if (c == '*') { RegexNode* node = s.top(); s.pop(); s.push(new RegexNode(c, node, nullptr)); } else if (c == '|') { RegexNode* right = s.top(); s.pop(); RegexNode* left = s.top(); s.pop(); s.push(new RegexNode(c, left, right)); } else if (c == '.') { RegexNode* right = s.top(); s.pop(); RegexNode* left = s.top(); s.pop(); s.push(new RegexNode(c, left, right)); } else { s.push(new RegexNode(c)); } } return s.top(); } // 将正则表达式转换为NFA NFA regexToNFA(RegexNode* node, int& state_id) { if (node->c == '*') { NFA nfa = regexToNFA(node->left, state_id); State* new_start = new State{state_id++, false, {{' ', nfa.start}, {' ', nullptr}}}; State* new_end = new State{state_id++, true, {{' ', nfa.start}, {' ', nullptr}}}; nfa.end->transitions.push_back({' ', nfa.start}); nfa.end->transitions.push_back({' ', new_end}); new_start->transitions.push_back({' ', nfa.start}); new_start->transitions.push_back({' ', new_end}); return NFA(new_start, new_end); } else if (node->c == '|') { NFA left_nfa = regexToNFA(node->left, state_id); NFA right_nfa = regexToNFA(node->right, state_id); State* new_start = new State{state_id++, false, {{' ', left_nfa.start}, {' ', right_nfa.start}}}; State* new_end = new State{state_id++, true, {}}; left_nfa.end->transitions.push_back({' ', new_end}); right_nfa.end->transitions.push_back({' ', new_end}); return NFA(new_start, new_end); } else if (node->c == '.') { NFA left_nfa = regexToNFA(node->left, state_id); NFA right_nfa = regexToNFA(node->right, state_id); left_nfa.end->transitions.push_back({' ', right_nfa.start}); return NFA(left_nfa.start, right_nfa.end); } else { State* start = new State{state_id++, false, {}}; State* end = new State{state_id++, true, {}}; start->transitions.push_back({node->c, end}); return NFA(start, end); } } int main() { string grammar = "a.b|c*"; RegexNode* regex = grammarToRegex(grammar); int state_id = 0; NFA nfa = regexToNFA(regex, state_id); // 输出NFA cout << "NFA:\n"; cout << "Start state: " << nfa.start->id << "\n"; cout << "End state: " << nfa.end->id << "\n"; for (State* state : {nfa.start, nfa.end}) { cout << "State " << state->id << ": "; if (state->is_final) { cout << "final\n"; } else { cout << "not final\n"; } for (auto transition : state->transitions) { cout << " " << transition.first << " -> " << transition.second->id << "\n"; } } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值