C语言算数表达式识别器:实现推导过程输出和合法性判断
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include
void rank1() { printf("%d\t", count); count++; }
void analyze() { if (m < 0) cout << ' '; else { for (int i = 0; i <= m; i++) cout << str[i]; } cout << '\t' << '\t' << '\t'; }
void latter() { printf("%c", str[index]); cout << '\t' << '\t' << '\t'; }
void remain() { for (int j = n + 1; j <= len; j++) cout << str[j]; cout << '\n'; }
void derivation(char* non_terminal, char* terminal) { printf("%s -> %s\n", non_terminal, terminal); }
/* 文法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 */
void E() { rank1(); printf("E -> TX\t\t"); analyze(); char non_terminal[10] = "E"; char terminal[10] = ""; T(); strcat(terminal, str + m + 1); m = n = index - 1; derivation(non_terminal, terminal); X(); }
void X() { if (str[index] == '+') { index++; rank1(); printf("X ->+TX\t\t"); analyze(); char non_terminal[10] = "X"; char terminal[10] = "+"; T(); strcat(terminal, str + m + 1); m = n = index - 1; derivation(non_terminal, terminal); X(); } else if (str[index] == '-') { index++; rank1(); printf("X ->-TX\t\t"); analyze(); char non_terminal[10] = "X"; char terminal[10] = "-"; T(); strcat(terminal, str + m + 1); m = n = index - 1; derivation(non_terminal, terminal); X(); } else { rank1(); printf("X -> ^\t\t"); analyze(); char non_terminal[10] = "X"; char terminal[10] = "^"; derivation(non_terminal, terminal); } }
void T() { rank1(); printf("T -> FY\t\t"); analyze(); char non_terminal[10] = "T"; char terminal[10] = ""; F(); strcat(terminal, str + m + 1); m = n = index - 1; derivation(non_terminal, terminal); Y(); }
void Y() { if (str[index] == '*') { index++; rank1(); printf("Y ->FY\t\t"); analyze(); char non_terminal[10] = "Y"; char terminal[10] = ""; F(); strcat(terminal, str + m + 1); m = n = index - 1; derivation(non_terminal, terminal); Y(); } else if (str[index] == '/') { index++; rank1(); printf("Y ->/FY\t\t"); analyze(); char non_terminal[10] = "Y"; char terminal[10] = "/"; F(); strcat(terminal, str + m + 1); m = n = index - 1; derivation(non_terminal, terminal); Y(); } else { rank1(); printf("Y -> ^\t\t"); analyze(); char non_terminal[10] = "Y"; char terminal[10] = "^"; derivation(non_terminal, terminal); } }
void F() { if (str[index] == 'i') { index++; rank1(); printf("F ->i\t\t"); analyze(); char non_terminal[10] = "F"; char terminal[10] = "i"; derivation(non_terminal, terminal); } else if (str[index] == '(') { index++; rank1(); printf("F ->(E)\t\t"); analyze(); char non_terminal[10] = "F"; char terminal[10] = "("; E(); if (str[index] == ')') { index++; strcat(terminal, str + m + 1); m = n = index - 1; strcat(terminal, ")"); derivation(non_terminal, terminal); } else { printf("否\n"); exit(0); } } else { printf("否\n"); exit(0); } }
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; }
原文地址: https://www.cveoy.top/t/topic/n96Y 著作权归作者所有。请勿转载和采集!