/*对应文法的SELECT集:
SELECT(S->AaS) = {a}
SELECT(S->BbS) = {c,b}
SELECT(S->d) = {d}
SELECT(A->a) = {a}
SELECT(B->ε) = {b}
SELECT(B->c) = {c}
根据每一个产生式的SELECT集合的元素,确定在该非终结符的
函数中,应该执行哪些匹配规则;(集合中的元素确定这个case里面的
语句,比如 对于 SELECT(S->AaS) = {a}:
case 'a' : {
A(), MatchToken('a'), S(); }
*/
#include <iostream>
#include <cstdio>
using namespace std;
char lookahead;//当前扫描到的符号
string input;//待判断的符号串
int pos = 0;//扫描到的串的位置
//匹配之后,消掉当前单词符号,读入下一个单词符号
char getToken() {
lookahead = input[pos++];
}
void MatchToken(char expected) {
//判断当前扫描的符号和期望的符号是否匹配
if(lookahead != expected) {
printf("该符号串不是此文法符号串\n");
exit(0);
} else {
lookahead = getToken();
}
}
void A();
void S();
void B();
int main(void) {
cin >> input;
lookahead = getToken();
S();
printf("匹配成功\n");
return 0;
}
void S() {
switch(lookahead) {
//对应产生式:S->AaS
case 'a':{
A();
MatchToken('a');
S();
break;
}
//对应产生式:S->BbS
case 'c':{
B();
MatchToken('b');
S();
break;
}
//对应产生式:S->BbS
case 'b':{
B();
MatchToken('b');
S();
break;
}
case 'd':{
MatchToken('d');
break;
}
default:{
printf("该符号串不是此文法符号串\n");
exit(0);
}
}
}
void A() {
switch(lookahead) {
case 'a':{
MatchToken('a');
break;
}
default:{
printf("该符号串不是此文法符号串\n");
exit(0);
}
}
}
void B() {
switch(lookahead) {
case 'c':{
//对应产生式:B->c
MatchToken('c');
break;
}
case 'b':{
//对应产生式:B->ε
break;
}
default:{
printf("该符号串不是此文法符号串\n");
exit(0);
}
}
}
代码为个人编写个人测试,个人能力有限,自己测试的样例均正确,但是不排除有遗漏的地方,如果发现,请指出。