我无法在线找到任何applet或程序将无上下文语言转换为下推自动机......任何帮助都将不胜感激。
答案 0 :(得分:2)
手工操作非常容易。 PDA具有开始状态s和最终状态f,它只有两个状态。进行转换((s,空,空),(f,S)),其中S是CFG的起始符号。对于每个规则X - > Y,其中X是非终端符号,Y是可能为空的终端和非终端字符串,进行转换((f,空,X),(f,Y))。最后,对于每个终端符号a,添加规则((f,a,a),(f,empty))。
这样做是通过按下堆栈上的起始符号开始的。然后它用生产规则的右侧替换它在堆栈顶部找到的任何非终结符,并匹配并弹出堆栈顶部的任何终端字符。
答案 1 :(得分:0)
请查看以下代码:https://github.com/P-Raj/AutomataPlus。它不仅包含将CFG转换为PDA的代码,还包含其他类似任务的代码。
答案 2 :(得分:0)
试试这个软:https://github.com/navrkald/regularConvertor。 您可以将整个转换CFG的算法抛向PDA。 它使用Qt在C ++中编写,在部分版本中,您已经为Windows构建了自执行二进制文件。
答案 3 :(得分:0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cout<<"Enter the no of Production Rules of CFG";
cin>>n;
char s1;
string s2;
vector<pair<char,string>> v;
cout<<"Please enter the Production rules of CFG \n";
for(int i=0;i<n;i++)
{ cin>>s1>>s2;
v.push_back(make_pair(s1,s2));}
cout<<"The Corresponding Production Rules For PDA are:-"<<endl;
cout<<"Rules For Non-Terminal Symbols are:- \n";
for(int i=0;i<n;i++){
int flag=0;
cout<<"dl(q,null," <<v[i].first<<") --> ";
string check=v[i].second;
int si=check.size();
string ans="";
for(int i=0;i<si;i++){ char ch=check[i];
if(ch == '|')
{ cout<<"dl(q,"<<ans<<") |";
ans="";}
else{ ans+=ch;}
}
if(flag!=1) cout<<"dl(q,"<<ans<<")"<<endl;
}
cout<<"dl(q,0,0)--> dl(q,null)"<<endl;
cout<<"dl(q,1,1) --> dl(q,null)"<<endl;
}