p[i].right=p[i].right.substr(1,p[i].right.length())+p[i].left;
p[count1].left=p[i].left;
p[count1].right=\用#代替空产生式 } else
p[i].right=p[i].right+p[i].left+\ } }
count1=count1+1; } }
count1--; return count1; }
void main( ) {
int i,j,count1;
cout<<\编译原理实验?非LL(1)文法到LL(1)文法的转换................\
cout<<\请输入产生式总数及各产生式?\其中左右部之间用'-'表示?空用'#'表示\ cin>>n;
Chomsky *p=new Chomsky[50]; // 初始化产生式数组
for(i=0;i cin>>strings; apart(p,i); } if(two(p)) { cout<<\该文法属于二型文法?实验继续...\ count1=remove(p,n); cout<<\转换后的文法输出如下?\ for(i=0;i<=count1;i++) { if(p[i].left[0]!=NULL) cout< cout<<\该文法不是2型文法?无需进行LL(1)的转换?实验结束\ system(\ } 八、思考题 1、 是不是所有的文法都可以通过上述程序构造LL(1)文法? 2、 LL(1)文法在整个语法分析中的作用? 3、 实验1中设计的文法数据结构对本实验的影响? 4、 如何更好地组合实验1和实验3,使之具有更高的效率?