转换上下文无关语言以推倒自动机的程序?

时间:2010-12-02 00:10:28

标签: context-free-grammar language-theory pushdown-automaton

我无法在线找到任何applet或程序将无上下文语言转换为下推自动机......任何帮助都将不胜感激。

4 个答案:

答案 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;
}