服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 用C++实现SLR语法分析程序

用C++实现SLR语法分析程序

2022-09-08 16:12newlw C/C++

大家好,本篇文章主要讲的是用C++实现SLR语法分析程序,感兴趣的同学赶紧来看一看吧,对你有帮助的话记得收藏一下

一、文法

原文法

E->E+T|E-T|T 
T->T*F|T/F|F 
F->id|(E)|num 
其中: id: a-f, A-F,num:0-9 

拓广文法

(0)S->E 
(1)E->E+T    (2)E->E-T    (3)E->T 
(4)T->T*F    (5)T->T/F    (6)T->F 
(7)F->i      (8)F->(E)    (9)F->n 
其中:i:id, n:num

 

二、SLR 分析表

用C++实现SLR语法分析程序

 

三、运行环境

CodeBlocks-13.12 with GCC compiler from TDM-GCC (4.7.1, 32 bit)

 

四、输入输出设计

输入:文件“fin.txt”输入待分析串

输出:SLR 分析过程输出至“fout.txt”

 

五、主要数据结构

// 拓广文法的产生式 
vector<string> G;        
// 文法符号到下标的转换字典 
map<char, int> index;    
// SLR action 表
vector<vector<int> > action;    
// SLR goto 表 
vector<vector<int> > goTo;      

 

六、核心算法

int main() 
{ 
    从文件 fin.txt 读取待分析串到 s; 
    s末尾加‘$"; 
    状态栈 vector<int> statusStack; 
    符号栈 vector<char> symbolStack; 
    状态栈 0;符号栈压‘$";
    ip 指向 s 的第一个字符; 
    do{ 
        top 是栈顶符号; 
        cur 是 ip 所指向的输入符号; 
        if(cur 是字母) cur = ‘i"; 
        if(cur 是数字) cur = ‘n"; 
        x = top 对应下标;
        y = cur 对应下标; 
        动作 val = action[x][y]; 
        if(val == acc){ 
            输出 acc;
            break;
        } 
        else if(val 为 shift){ 
            输出 shift;
            当前输入符号 cur 压入符号栈; 
            动作 val 压入状态栈; 
        } 
        else if(val 为 reduce){ 
            len = reduce 产生式右部长度;
            状态栈和符号栈各弹出 len 个; 
            topS = 当前状态栈栈顶;
            curA = 产生式左部非终结符号; 
            x = topS 对应下标;
            y = curA 对应下标;
            curA 压入符号栈;
            goto[x][y]压入状态栈;
            输出 reduce 产生式; 
        } 
        else{ 
            error;
            break;
        } 
    }while(true);
} 

 

七、测试

用C++实现SLR语法分析程序

用C++实现SLR语法分析程序

到此这篇关于用C++实现SLR语法分析程序的文章就介绍到这了,更多相关C++实现SLR语法分析内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/newlw/article/details/122798277

延伸 · 阅读

精彩推荐
  • C/C++C++11 关键字 const 使用小结

    C++11 关键字 const 使用小结

    const大致意思是“我承诺不改变这个值”。主要用于说明接口,这样在把变量传入函数时就不必担心变量会在函数内被改变,本文给大家介绍C++11 关键字 ...

    MushRain6692022-07-08
  • C/C++C语言解决堆栈括号匹配问题示例详解

    C语言解决堆栈括号匹配问题示例详解

    这篇文章主要为大家介绍了C语言堆栈括号匹配问题示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    xr4154432022-02-25
  • C/C++C++日志记录类实例解析

    C++日志记录类实例解析

    这篇文章主要介绍了C++日志记录类实例,代码功能非常实用,需要的朋友可以参考下...

    C++教程网6722021-01-24
  • C/C++C++11 并发指南之std::thread 详解

    C++11 并发指南之std::thread 详解

    这篇文章主要介绍了C++11 并发指南之std::thread 详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    Haippy11762021-08-13
  • C/C++C语言 结构体(Struct)详解及示例代码

    C语言 结构体(Struct)详解及示例代码

    本文主要介绍C语言 结构体的知识,学习C语言肯定需要学习结构体,这里详细说明了结构体并附示例代码,供大家参考学习,有需要的小伙伴可以参考下...

    C语言中文网4702021-04-14
  • C/C++C语言菜鸟基础教程之for循环

    C语言菜鸟基础教程之for循环

    c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替wh...

    翡翠森林Z7942021-06-04
  • C/C++关于C++静态数据成员的实现讲解

    关于C++静态数据成员的实现讲解

    今天小编就为大家分享一篇关于关于C++静态数据成员的实现讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    Engineer-Bruce_Yang8492021-07-13
  • C/C++C语言图书借阅系统源码

    C语言图书借阅系统源码

    这篇文章主要为大家分享了C语言图书借阅系统源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    C语言教程网12152021-06-21