题目介绍
题目思路
题目给的表达式文法为:
- E→TG
- G→+TG | ε
- T→FS
- S→*FS | ε
- F→(E) | i
例如:i+i*i是文法能生成的一个表达式,输出格式举例:
- 0 E–>TG
- 1 T–>FS
- 2 F–>i
- 3 S–>&
- 4 G–>+TG
- 5 T–>FS
- 6 F–>i
- 7 S–>*FS
- 8 F–>i
- 9 S–>&
- 10 G–>&
- accept
i@i不是文法能生成的表达式,输出格式举例:
- 0 E–>TG
- 1 T–>FS
- 2 F–>i
- 3 S–>&
- 4 G–>&
- error
(i+i*i不是文法能生成的表达式,存在括号不匹配的语法错误,输出格式举例:
- 0 E–>TG
- 1 T–>FS
- 2 F–>(E)
- 3 E–>TG
- 4 T–>FS
- 5 F–>i
- 6 S–>&
- 7 G–>+TG
- 8 T–>FS
- 9 F–>i
- 10 S–>*FS
- 11 F–>i
- 12 S–>&
- 13 G–>&
- error
当你输入符号串的时候:
- 首先要进行E()函数,该函数的意思是直接输出E所对应的文法E–>TG,可以直接跑到T()和G()
- 对于T函数来说,直接根据题目输出T–>FS,来进入到F函数和S函数
- 对于G函数来说,题目给的是G→+TG | ε,所以需要判断当前的字符是否为+号,如果当前字符为+的话,直接输出G–>+TG,num要加一位并且进入T函数和G函数,反之直接输出G–>&
- 对于F函数来说,题目给的是F→(E) | i,所以需要判断当前的字符是否为i和(,如果当前是i的话,输出F–>i,如果是(的话,输出F–>(E),并且num++和进入E函数,这里需要再一次判断当前的字符串是否为(,防止只有右括号没有左括号的现象
- 对于S函数来说,题目给的是S→*FS | ε如果当前字符串是*,直接输出**S→FS**,否则输出S→&*
易错点
- 在判断字符的时候忘记进行num++
- num++一定要在递归之前
代码
/* author:苦酒 QQ:1793929520 blog:huangliangshuai.com */ #include <iostream> #include <string> #include <cstdlib> #include <cstring> #include <stdio.h> using namespace std; char str[101]; int sum = 0; int num = 0; void E(); void T(); void G(); void F(); void S(); void E() { cout<<sum++<<" "<<"E-->TG"<<endl; T(); G(); } void T() { cout<<sum++<<" "<<"T-->FS"<<endl; F(); S(); } void G() { if(str[num] == '+') { cout<<sum++<<" "<<"G-->+TG"<<endl; num++; T(); G(); } else { cout<<sum++<<" "<<"G-->&"<<endl; } } void F() { if(str[num] == 'i') { cout<<sum++<<" "<<"F-->i"<<endl; num++; } else if(str[num] == '(') { cout<<sum++<<" "<<"F-->(E)"<<endl; num++; E(); if(str[num] == ')') { num++; } else { printf("error\n"); exit(0); } } else { printf("error\n"); exit(0); } } void S() { if(str[num] == '*') { cout<<sum++<<" "<<"S-->*FS"<<endl; num++; F(); S(); } else { cout<<sum++<<" "<<"S-->&"<<endl; } } int main() { scanf("%s", str); E(); if(str[num] != '#') { cout<<"error"<<endl; } else { cout<<"accept"<<endl; } } /*************************************************** User name: jk170631黄良帅 Result: Accepted Take time: 0ms Take Memory: 192KB Submit time: 2019-11-19 19:24:50 ****************************************************/