为下列文法选择最准确的答案:
文法G[S]属于(12):
S→CD Ab→bA
C→aCA Ba→aB
C→bCB Bb→bB
AD→aD C→s
BD→bD D→c
Aa→bD
L(G)={ww|w∈{a,b)*)
文法G[冈属于(13):
P→0A|1B|O
A→0A|1B|0P
B→1B|1|0
文法G[1]属于(14):
I→1T
I→1
T→1T
T→dT
T→1
T→d
其中,1表示a~z中的任意一个英文字母,d表示0~9中的任意一个数字。
A.1型(上下文有关)文法
B.2型(上下文无关)文法
C.定义标识符的3型(正规)文法
D.0型文法
A.G[A]定义的语言由0、1符号串组成,或者串中1的个数是0的个数2倍,或者串中0的个数是1的个数2倍
B.G[A]定义的语言由0、l符号串组成,串中0的个数是1的个数2倍
C.G[A]定义的语言由0、1符号串组成,串中1的个数是0的个数2倍
D.G[A]定义的语言由0、1符号串组成,串中0和1的个数相同
已知文法G1=(VT={a,b,d},VN={S,A,B},S,P),其中P为, S→dAB A→aA|a B→bB|ε 该文法生成的语言是(28)。
A.{dambn|m≥0,n≥O}
B.{dambn|m≥1,n≥0}
C.{dambn|m≥0,n≥1}
D.{dambn|m≥1,n≥1}
文法G[S]:S→xSx|y所描述的语言是______ (n≥0)。
A.(xux)n
B.xyxn
C.xynx
D.xnyxn
已知文法G: S—A0|B1,A- S1|1, B-*S0|0,其中S是开始符号。从S出发可以推导出(12)。
A.所有由0构成的字符串
B.所有由1构成的字符串
C.某些0和1个数相等的字符串
D.所有0和1个数不同的字符串
在形式语言中,若文法G的产生式集P为:
(1)Z→Bc(2)Z→Zc(3)B→Ab(4)B→Bb(5)A→Aa(6)A→a
则文法G是(27)文法,识别G的自动机为(28)。对于G来说,(29)为文法G可接受的字符串,(30)为文法G不可接受的字符串。
供选择的答案:
A.短语
B.上下文有关
C.上下文无关
D.正则
在形式语言中,文法G是一个四元组G=(VN,Vr,P,Z),其中VN为(6)。若文法C的产生式集P为:
(1)Z→Bc (2)Z→Zc (3)B→Ab (4)B→Bb (5)A→Aa (6)A→a
则文法G是(7)文法,识别G的自动机为(8)。对于G来说,(9)为文法G可接受的字符串,(10)为文法G不可接受的字符串。
供选择的答案:
A.状态标志符
B.开始符
C.语句集
D.非终结符集合
●试题二
对文法G[S]:S→a|∧|(T);T→T,S|S;回答问题1~问题3。
【问题1】
对文法G进行改写,然后对每个非终结符写出不带回溯的递归子程序。
【问题2】
经改写后的文法是否是LL (1) 的?指出它的预测分析表中 (1) ~ (3) 处的内容。
【问题3】
说明输入串(a,a)是否为G的句子。
●试题五
阅读下列程序说明和C代码,将应填入(n)处的字句写在答卷的对应栏内。
【程序5说明】
下列文法可用来描述化学分子式的书写规则(例如,Al2(CO3)3、Cu(OH)2):
λ→β\βλβ→δ\δn
δ→ξ\ξθ\(λ)
其中:λ是一个分子式;δ或是一个元素,或是一个带括号的(子)分子式,元素或是一个大写字母(记为ξ),或是一个大写字母和一个小写字母(记为ξθ);β或是一个δ,或是在δ之后接上一个整数n,δn表示β有n个δ的元素或(子)分子式。一个完整的分子式由若干个β组成。
当然一个正确的分子式除符合上述文法规则外,还应满足分子式本身的语义要求。
下面的程序输入分子式,按上述文法分析分子式,并计算出该分子式的分子量。例如:元素H的原子量是1,元素O的原子量是16。输入分子式H2O,程序计算出它的分子量为18(1×2+16)。程序中各元素的名及它的原子量从文件atom.dat中读入。
【程序5】
#include<stdio.h>
#include<string.h>
#define MAXN 300
#define GMLEN 30
struct elem{char name[];/*元素名*/
doublev;/*原子量*/
}nTbl[MAXN];
char cmStr[GMLEN],*pos;
int c;FILE*fp;
double factor();
double atom()/*处理文法符号δ*/
{char w[3];int i;double num;
while((c=*pos++)==′||c==′\t′);/*略过空白字符*/
if(c==′\n′)return 0.0;
if(c>=′A′ && C<=′Z′){/*将元素名存入W*/
w[i=0]=c;c=*pos++;
if(c>=′a ′&& c<=′z′)w[++i]=c;else pos--;
w[++i]=′\0′;
for(i=0;nTbl[i].v>0.0;i++)
if(strcmp(w,nTb[i].name)==0)returnnTbl[i].v;
printf("\n元素表中没有所输入的元素:\t%s\n",w);retur n-1.0;
}elseif(c==′(′){
if((num= (1) )<0.0)return-1.0;/*包括可能为空的情况*/
if(*pos++!=′)′){printf("分子式中括号不匹配!/n");return-1.0;}
returnnum;
}
printf("分子式中存在非法字符:\t%c\n",c);
return-1.0;
}
double mAtom()/*处理文法符号β*/
{double num;int n=1;
if((num= (2) )<0.0)return-1.0;
c=*pos++;
if(c>=′0′&&c<=′9′){
n=0;while(c>=0&&c<=′9′)
{n= (3) ;
c=*poss++;
}
}
pos--;
return num*n;
}
double factor()/*处理文法符号λ*/
{double num=0.0,d;
if((num=mAtom())<0.0)return-1.0;
while(*pos>=′A′&&*pos<=′Z′||*pos==′(′){
if((d= (4) )<0.0)return-1.0;
(5) ;
}return num;
}
void main()
{char fname[]="atom.dat";/*元素名及其原子量文件*/
int i;double num;
if((fp=fopen(fname,"r"))==NULL){/*以读方式打开正文文件*/
printf("Can not open%s file.\n",fname);return/*程序非正常结束*/
}
i=0;
while(i<MAXN&&fscanf(fp,"%s%lf",bTbl[i].name,&nTbl[i].v)==2)
i++;
fclose(fp);nTbl[i].v=-1.0;
while (1) {/*输入分子式和计算分子量循环,直至输入空行结束*/
printf("\n输入分子式!(空行结束)\n");gets(cmStr);
pos=cmStr;
if(cmStr[0]==′\0′)break;
if((num=fator())>0.0)
if(*pos!=′\0′)printf("分子式不完整!\n");
else printf("分子式的分子量为%f\n",num);
}
}