#include <stdio.h> #include <stdlib.h> #include <string.h> #include using namespace std; char str[10]; int index = 0; void E(); // E->TX; void X(); // X->+TX|-TX|^ void T(); // T->FY void Y(); // Y->*FY|/FY|^ void F(); // F->(E) | i int count; int m, n; int len;

void rank1() { printf("%d\t", count); count++; }

void analyze() { if (m < 0) printf(" \t\t\t"); else { for (int i = 0; i <= m; i++) printf("%c", str[i]); printf("\t\t\t"); } }

void latter() { printf("%c\t\t\t", str[index]); }

void remain() { for (int j = n + 1; j <= len; j++) printf("%c", str[j]); printf("\n"); }

/* 文法G[E]: E → E+T | E-T | T T → T*F | T/F | F F → (E) | i 消除左递归后: E → TX X → +TX|-TX|^ T → FY Y → *FY | /FY|^ F → (E) | i */

int main() { count = 0; m = -1, n = -1; index = 0; printf("请输入算数表达式:"); scanf("%s", str); len = strlen(str); str[len] = '#'; printf("步骤\t 文法\t\t 分析串\t\t\t分析字符\t\t剩余串\n"); E(); if (str[index] == '#') printf("是\n"); else printf("否\n"); return 0; }

void E() { rank1(); printf("E -> TX\t\t"); analyze(); latter(); remain(); T(); X(); }

void X() { if (str[index] == '+') { index++; rank1(); printf("X ->+TX\t\t"); m++; n++; analyze(); latter(); remain(); T(); X(); } else if (str[index] == '-') { index++; rank1(); printf("X ->-TX\t\t"); m++; n++; analyze(); latter(); remain(); T(); X(); } else { rank1(); printf("X -> ^\t\t"); analyze(); latter(); remain(); } } void T() { rank1(); printf("T -> FY\t\t"); analyze(); latter(); remain(); F(); Y(); } void Y() { if (str[index] == '*') { index++; rank1(); printf("Y ->*FY\t\t"); m++; n++; analyze(); latter(); remain(); F(); Y(); } else if (str[index] == '/') { index++; rank1(); printf("Y ->/FY\t\t"); m++; n++; analyze(); latter(); remain(); F(); Y(); } else { rank1(); printf("Y -> ^\t\t"); analyze(); latter(); remain(); } } void F() { if (str[index] == 'i') { index++; rank1(); printf("F ->i\t\t"); m++; n++; analyze(); latter(); remain(); } else if (str[index] == '(') { index++; rank1(); printf("F ->(E)\t\t"); m++; n++; analyze(); latter(); remain(); E(); if (str[index] == ')') { index++; rank1(); printf("F ->(E)\t\t"); m++; n++; analyze(); latter(); remain(); } else { printf("否\n"); exit(0); } } else { printf("否\n"); exit(0); }

将以下代码功能增加#include stdioh#include stdlibh#include stringh#include iostreamusing namespace std;char str10;int index = 0;void E; E-TX;void X; X-+TX-TX^void T; T-FYvoid Y; Y-FYFY^void F; F-E ii

原文地址: https://www.cveoy.top/t/topic/fip4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录