编译原理 语法分析器
怎样才能让它在输出error之后不往下分析
#include <iostream>
using namespace std;
int token_len = 0; // 存放待分析串长度
int step; // 记录当前分析步数
int stack_top; // 符号栈的栈顶指针
char stack[10] = {'#'}; // 存放符号栈内容,初始压入'#'
char token[100]; // 存放待分析串
int lookahead = 0;
bool error_flag=false;
// 字符分析标志
void print() {
cout << step << "\t"; // 打印分析第step步
for (int i = 0; i <= stack_top; i++) // 输出分析栈中内容
cout << stack[i];
// 列对齐处理
if (stack_top < 7)
cout << "\t\t";
else
cout << "\t";
for (int i = 0; i < lookahead; i++) { // 若字符已被分析,它的位置置空,保持列对齐
token[i] = ' ';
cout << token[i];
}
for (int i = lookahead; i < token_len; i++) // 输出剩余待分析字符
cout << token[i];
cout << "\t"; // 为输出表达式做准备
}
void E();
void E1();
void T();
void T1();
void F();
void E() {
print(); // 打印当前步骤信息
cout << "E->TE'\n"; // 输出表达式
stack[stack_top] = 'E'; // 将产生式右→左压栈
stack[++stack_top] = '\''; // 代表E'
stack[++stack_top] = 'T';
step++; // 分析步数+1
T();
E1();
}
void E1() {
if (token[lookahead] == '+') { // 若待分析字符匹配‘+’
print(); // 打印当前步骤信息
cout << "E'->+TE'\n"; // 输出表达式
stack[--stack_top] = 'E'; // 将产生式右→左压栈
stack[++stack_top] = '\'';
stack[++stack_top] = 'T';
step++; // 分析步数+1
lookahead++; // 因为匹配到一个终结符,所以分析下一个字符
T();
E1();
} else {
print(); // 打印当前步骤信息
cout << "E'->ε\n"; // 输出表达式
stack[stack_top--] = NULL; // 出栈
stack[stack_top--] = NULL; // E'虽然为一个非终结符,但占两个字符,T'同
step++; // 分析步数+1
}
}
void T() {
print(); // 打印当前步骤信息
cout << "T->FT'\n"; // 输出表达式
stack[stack_top] = 'T'; // 将产生式右→左压栈
stack[++stack_top] = '\'';
stack[++stack_top] = 'F';
step++; // 分析步数+1
F();
T1();
}
void T1() {
if(token[lookahead] == '*') { // 若待分析字符匹配‘*’
print(); // 打印当前步骤信息
cout << "T'->*FT'\n"; // 输出表达式
stack[--stack_top] = 'T'; // 将产生式右→左压栈
stack[++stack_top] = '\'';
stack[++stack_top] = 'F';
step++; // 分析步数+1
lookahead++; // 因为匹配到一个终结符,所以分析下一个字符
F();
T1();
} else {
print(); // 打印当前步骤信息
cout << "T'->ε\n"; // 输出表达式
stack[stack_top--] = NULL; // 出栈
stack[stack_top--] = NULL;
step++; // 分析步数+1
}
}
void F() {
if (token[lookahead] == 'i') { // 若待分析字符匹配‘i’
print(); // 打印当前步骤信息
cout << "F->i\n"; // 输出表达式
stack[stack_top--] = NULL; // 出栈
step++; // 分析步数+1
lookahead++; // 因为匹配到一个终结符,所以分析下一个字符
} else if (token[lookahead] == '(') { // 若待分析字符匹配‘(’
print(); // 打印当前步骤信息
cout << "F->(E)\n"; // 输出表达式
stack[stack_top] = 'E'; // 将产生式右→左压栈
step++; // 分析步数+1
lookahead++; // 因为匹配到一个终结符,所以分析下一个字符
E();
if (token[lookahead] == ')') { // 若待分析字符匹配‘)’
lookahead++; // 因为匹配到一个终结符,所以分析下一个字符
} else {
cout << "without a ')'\n";
error_flag=true;
return;
}
} else {
cout << "error...\n";
error_flag=true;
return;
}
}
int main(void){
cout<<"Please input(end with #):"<<endl; //输入待分析字符串
while (token[lookahead] != '#'){ //如果没有按下#结束
char scan_char; //扫描字符
do{ //若没有扫描到结束符#,就继续扫描
cin>>scan_char;
token[token_len] = scan_char; //将扫描到的字符保存到待分析串数组中
token_len++;
} while (scan_char != '#');
cout<<"\n";
cout<<"No.\t";
cout<<"Stack\t\t";
cout<<"String\t";
cout<<"Expression\n";
print(); //打印当前步骤信息
cout<<"\n"; //换行
stack[++stack_top] = 'E'; //将E()压入栈中,开始分析
step++; //分析步数+1
E();
if (token[lookahead] == '#'&&(!error_flag)) //若待分析字符为#,说明符合文法
cout<<"Successful!";
else
cout<<"Failed";
}
return 0;
}