编译原理有限自动机的构造与识别

K:=S;

c:=getchar;

while c<>eof do

{K:=f(K,c); c:=getchar; }; if K is in Z then return (‘yes’) else return (‘no’)
复制代码

 

开始编程!

1.状态转换式构造类:
current——当前状态
next——下一状态

复制代码
class TransTile
{
public:
    char current; char next; char input; TransTile(char C,char I,char Ne){ current = C; next = Ne; input = I; } };
复制代码

 

2.DFA的构造类

此处包括DFA的数据集,字母表,以及过程P的定义。

包括了初始化,遍历转换,以及最终的字符串识别。

复制代码
class DFA
{
public:
    //构造状态集各个元素 string States; char startStates; string finalStates; string Alphabets; vector <TransTile> Tile; DFA(){ init(); } void init() { cout << "输入有限状态集S:" << endl; cin >> States; cout << "输入字符集A:" << endl; cin >> Alphabets; cout << "输入状态转换式(格式为:状态-输入字符-下一状态,输入#结束):" << endl; cout << "例如:1a1 \n 1a0 \n 2a1 \n #" << endl; int h = 0; //while (cin>>input){ // TransTile transval(input[0], input[1], input[2]); // Tile.push_back(transval); //} while(true){ char input[4]; cin>>input; if(strcmp(input,"#")==0) break; TransTile transval(input[0],input[1],input[2]); Tile.push_back(transval); } cout << "输入初态:" << endl; cin >> startStates; cout << "输入终态:" << endl; cin >> finalStates; } //遍历转换表 char move(char P,char I){ for (int i = 0; i < Tile.size(); i++){ if (Tile[i].current == P&&Tile[i].input == I){ return Tile[i].next; } } return 'E'; } //识别字符串函数 void recognition(){ string str; cout << "输入需要识别的字符串:" << endl; cin >> str; int i = 0; char current = startStates; while (i < str.length()){ current = move(current, str[i]); if (current == 'E'){ break; } i++; } if (finalStates.find(current) != finalStates.npos){ cout << "该自动机识别该字符串!" << endl; } else { cout << "该自动机不能识别该字符串!" << endl; } } };
复制代码

 

3.测试

Main函数

复制代码
int main(){
    DFA dfa;    
    bool tag;

    while(1){ cout<<"你想要继续吗?是请输入1,否输入0:"<<endl; cin>>tag; if(tag){ dfa.recognition(); }else break; } return 0; }

转载于:https://www.cnblogs.com/lianghaohui123/p/6102527.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一 用PL/O语言编写用户源程序 (一)实验目的:  1了解运行TURBO PASCAL系统对计算机软硬件环境的要求。 2熟悉PASCAL系统中的基本语句及文件类型的使用方法。 3掌握PL/O语言源程序的结构及构成规则。 (二)实验内容与步骤  1用PL/0语言编写程序:建立和访问正文文件 2用PL/O语言编写能打印如下图形的程序 * * * * * * * * * * * * * * * * * * * * * * * * * 3用PL/O语言编写求3~100之间全部素数的程序。 4 将一正数倒置。 5 对任意给定的整数,列出其二进制、八进制、十六进制表示形式。 6深刻理解源程序、目标程序、编译程序的概念。 7用EBNF描述PL/O语言的程序结构及构成规则。 注:  实验二 构造识别符号串的自动机 (一)实验目的: 1掌握形式语言与自动机的概念 2了解正规集及有穷自动机的关系 3能构造识别相应符号串的自动机 4能构造词法分析程序所识别的各类单词的自动机 (二)实验步骤及内容: 1用高级语言编写程序:该程序能接受所有的标识符。 2用高级语言编写程序:该程序能接受所有的常数(整数和定点小数)。 3用高级语言编写程序:该程序能接受PL/0的所有保留字。 4 用高级语言编写程序:该程序能接受PL/0的所有界符、运算符。 (三)有关说明:  1高级及语言可选择 C语言实现。 2以上各程序要求:对输入的任意符号串能给出接受与否的识别信息。 实验三 词法分析程序的构造 (一)实验目的 1掌握PL/O编译程序的使用方法 2掌握PL/O编译程序的总体结构 3掌握PL/O编译程序的词法分析程序 4改编总控程序和词法分析程序 (二)实验内容及步骤 1单词的分类: 可将所有标识符归为一类;将常数归为另一类:保留字、界符、运算符符则可采取一词一类。 2符号表的建立 可事先建立一保留字表,以备识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。 3单词串的输出形式: 所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该常数(整数)的二进制形式)。对于保留字、界符和运算符,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。(或:为便于查看由词法分析程序输出的单词串也可以在CLASS字段上放置单词符号串本身)。 4编写上述词法分析程序 (三)有关说明:  1该词法分析程序只能识别用PL/O语言书写的简单程序。 2也可改编PL/O的编译程序中的词法分析程序,使之能识别含repeat语句的程序。 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值