第十二次作业

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

 

  1. 消除左递归

P={

S->SaA

S->aS|ε

A->bB

B->cC|c

C->dD

D->eE|e

E->fF|ε

F->f

}

 

  1. 提取公共左因子

P={

S->SaA

S->aS|ε

A->bB

B->cC’

C->C|ε

C->dD

D->eE

E->E|ε

E->fF

F->g

}

 

5.SELECT集计算

SELECT{S->SaA}={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->SaA';  
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; } }
posted @ 2019-11-29 21:40  蔡云桓  阅读(109)  评论(0编辑  收藏  举报