第十二次作业
1.待分析的语言的语法
2.将其改为文法表示,至少包含(语句、条件、表达式)
G=(VN,VT,P,S )
VN={S,A,B,C,D,E,F}
VT={c,f,ε,e}
P={
S->aS|aA
A->bB
B->cC|c
C->dD
D->eE|e
E->fF|ε
F->f
}
W=aabcdeeff
S=>aA=>abB=>abcC=>abcdD=>abcdeE=>abcdefF=>abcdeff
- 消除左递归
P={
S->S’aA
S’->aS’|ε
A->bB
B->cC|c
C->dD
D->eE|e
E->fF|ε
F->f
}
- 提取公共左因子
P={
S->S’aA
S’->aS’|ε
A->bB
B->cC’
C’->C|ε
C->dD
D->eE’
E’->E|ε
E->fF
F->g
}
5.SELECT集计算
SELECT{S->S’aA}={a}
SELECT{S’->aS’}={a}
SELECT{A->bB}={b}
SELECT{B->cC’}={c}
SELECT{C’->C}={d}
SELECT{C’->ε}={e}
SELECT{C->dD}={d}
SELECT{D->eE’}={e}
SELECT{E’->E}={f}
SELECT{E’->ε}={g}
SELECT{F->f}={f}
6.LL(1)文法判断
因为SELECT中无交集所以为LL(1)文法
7.
#include<iostream> #include<stdio.h> #include<string> using namespace std; string str; int index = 0; void S(); //S->S’aA';
void S'(); //S’->aS’|ε void A(); //A->bB void B(); //B->cC’
void C'(); //C’->C|ε void C(); //C->dD void D(); //D->eE’
void E'(); //E’->E|ε
void E(); //E->fF
void F(); //F->g void error() { cout << "该符号串不是句子!" << endl; } void S() { S'();
MatchToken(a); A'(); } void E1() { if (str[index] != '') {
MatchToken(a);
S'(); }
else{
break;
} } void A() {
MatchToken(a);
B();
} void B() { MatchToken(c); C'(); } void C'() { if (str[index] =='C') { C(); } else { break; } } }
void C()
{
MatchToken(d);
d();
} void E'()
{
if(str[index]=='E'){
E();
}else{
break;
}
}
void E(){
MatchToken(f);
F();
}
void F(){
MatchToken(g);
}
int main() { cout << "请输入符号串:" << endl; cin >> str; S(); if (str[index] == '#') cout << "该符号串是句子!" << endl; else { cout << "该符号串不是句子!" << endl; } }