粥粥528 2023-05-30 18:16 采纳率: 84%
浏览 53

关于#c++#的问题:编译原理语法分析器怎样才能让它在输出error之后不往下分析#include <iostream>

编译原理 语法分析器
怎样才能让它在输出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;
}

  • 写回答

2条回答 默认 最新

  • xiaoyuer2815 2023-05-30 20:21
    关注

    可以在输出error后直接用exit(0);结束程序。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月30日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境