一.实验目的:
二.实验内容
已知文法G[S]:
S→MH|a
H→LSo|ε
K→dML|ε
L→eHf
M→K|bLM
三.实验要求:
1.给出文法的FIRST集和FOLLOW集(程序实现)。
2.构造该文法的语法分析表。
3.根据语法分析表模拟LL(1)语法分析过程。
3.设计相应的例子进行测试,输入所给句子的语法分析过程。
四、我的代码
运行效果图
- 能够判一文法是否为LL(1)文法;
- 能构造LL(1)语法分析表;
- 以程序实现LL(1)的语法分析过程。
二.实验内容
已知文法G[S]:
S→MH|a
H→LSo|ε
K→dML|ε
L→eHf
M→K|bLM
三.实验要求:
1.给出文法的FIRST集和FOLLOW集(程序实现)。
2.构造该文法的语法分析表。
3.根据语法分析表模拟LL(1)语法分析过程。
3.设计相应的例子进行测试,输入所给句子的语法分析过程。
四、我的代码
- #include <stdio.h>
- /*
- *First(S)={a, b, d, e, ε}
- *First(H)={e, ε}
- *First(K)={d, ε}
- *First(L)={e}
- *First(M)={b, d, ε}
- *Follow(S)={#, o}
- *Follow(H)={#, o, f}
- *Follow(K)={#, e, o}
- *Follow(L)={o, a, b, d, e}
- *Follow(M)={#, e, o}
- */
- char str[100];
- int length;
- int count;
- char stack[100];
- int top;
- void error() {
- printf("\t\t不接受!\n");
- }
- int matcher() {
- switch(stack[top-1]) {
- case 'S':
- if(str[count] == 'b' || str[count] == 'd' ||
- str[count] == 'e' || str[count] == 'o' ||
- str[count] == '#') {
- top--;
- stack[top++] = 'H';
- stack[top++] = 'M';
- printf("\t\tS->MH\n");
- } else if(str[count] == 'a') {
- top--;
- stack[top++] = 'a';
- printf("\t\tS->a\n");
- } else {
- return -1;
- }
- break;
- case 'H':
- if(str[count] == 'f' || str[count] == 'o' ||
- str[count] == '#') {
- top--;
- printf("\t\tH->ε\n");
- } else if(str[count] == 'e') {
- top--;
- stack[top++] = 'o';
- stack[top++] = 'S';
- stack[top++] = 'L';
- printf("\t\tH->LSo\n");
- } else {
- return -1;
- }
- break;
- case 'K':
- if(str[count] == 'e' || str[count] == 'o' || str[count] == '#') {
- top--;
- printf("\t\tK->ε\n");
- } else if(str[count] == 'd') {
- top--;
- stack[top++] = 'L';
- stack[top++] = 'M';
- stack[top++] = 'd';
- printf("\t\tK->dML\n");
- } else {
- return -1;
- }
- break;
- case 'L':
- if(str[count] == 'e') {
- top--;
- stack[top++] = 'f';
- stack[top++] = 'H';
- stack[top++] = 'e';
- printf("\t\tL->eHf\n");
- } else {
- return -1;
- }
- break;
- case 'M':
- if(str[count] == 'd' || str[count] == 'e' || str[count] == 'o' || str[count] == '#') {
- top--;
- stack[top++] = 'K';
- printf("\t\tM->K\n");
- } else if(str[count] == 'b') {
- top--;
- stack[top++] = 'M';
- stack[top++] = 'L';
- stack[top++] = 'b';
- printf("\t\tM->bLM\n");
- } else {
- return -1;
- }
- break;
- default:
- return -1;
- }
- return 0;
- }
- void print() {
- int i;
- for(i = 0; i < top; i++) {
- printf("%c", stack[i]);
- }
- printf("\t\t");
- for(i = 0; i < count; i++) {
- printf(" ");
- }
- for(i = count; i < length; i++) {
- printf("%c", str[i]);
- }
- }
- int main() {
- printf("\ta\tb\td\te\to\tf\t#\n");
- printf("S\tS->a\tS->MH\tS->MH\tS->MH\tS->MH\t\tS->MH\n");
- printf("H\t\t\t\tH->LSo\tH->ε\tH->ε\tH->ε\n");
- printf("K\t\t\tK->dML\tK->ε\tK->ε\t\tK->ε\n");
- printf("L\t\t\t\tL->eHf\t\t\t\n");
- printf("M\t\tM->bLM\tM->K\tM->K\tM->K\t\tM->K\n");
- while(1) {
- printf("\n\n");
- char c=' ';
- int i = 0;
- while(c!='#' && c!='$') {
- scanf("%c", &c);
- str[i++] = c;
- }
- getchar();
- length = i;
- top = 0;
- stack[top++] = '#';
- stack[top++] = 'S';
- count = 0;
- printf("栈\t\t输入串\t\t匹配或使用的产生式\n");
- while(top-1 != 0 || count != length-1) {
- if(stack[top-1] == str[count]) {
- print();
- printf("\t\t'%c'匹配\n", str[count]);
- top--;
- count++;
- } else {
- print();
- if(matcher() == -1) {
- error();
- break;
- }
- }
- }
- if(top-1 == 0 && count == length-1) {
- print();
- printf("\t\t接受\n");
- }
- }
- return 0;
- }
运行效果图
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏