美文网首页
编译原理实验,词法分析,LL(1),LR(1)

编译原理实验,词法分析,LL(1),LR(1)

作者: _千寻瀑_ | 来源:发表于2018-06-18 21:49 被阅读0次

    代码在https://github.com/xuan45/Compiler-Principle
    记得点个star哦

    Introduction

    编译原理实验

    • 词法分析器和LL(1)文法核心代码均采用C++实现,服务端代码使用Koa2实现,前端可视化代码使用React实现
      js作为胶水层(node-ffi)将c++运行的结果转发给前端,数据格式使用json
    • LR(1)文法我用的是JavaScript,原因是我做LL(1)文法的时候,要把预测分析表可视化出来,这样去拼接json字符串给nodejs太麻烦了
      于是我就用了JavaScript,便于可视化图表等,而且数据结构也比C++好用

    使用

    npm install 安装依赖
    npm run server 开启服务端
    npm run dev 开启react开发
    npm start 同时启动server和dev
    

    环境:

    windows10 + vs2015 + nodejs-v8.9.3

    • ffi引用dll库时参考的文章
    • ffi引入函数名错误参考的文章
    • 编译dll的时候,在CompilersPrinciplesDll.cpp文件里面引入iostream, string等头文件报错,将头文件引入至stdafx.h即可解决
    • ffi里面的string类型对应c++是char* 类型的,而我需要使用string,直接使用string无法获取参数和结果,所以写了个函数转换
    • 其实可以不用ffi的,但是要安装c++编译器,利用child_process.exec去执行cpp文件,然后利用exec返回的子进程进行管道通信
    // char* 可直接赋值给string
    // string 转 char*,用来返回结果给nodejs
    char* to_char_pointer(string str) {
        int length = (int)str.length();
        char *p = new char[length + 1];
        for (int i = 0; i < length; ++i) {
            p[i] = str[i];
        }
        p[length] = '\0'; //加上结束符
        return p;
    }
    

    效果预览

    • 词法分析

    词法分析我是利用循环来实现自动机匹配标识符,数字等等


    image.png
    • LL(1)

    LL的关键在于求出first集和follow集,求first集的时候要注意消除左递归,然后根据first集和follow集求出预测分析表


    image.png
    • LR(1)


      image.png

    相关文章

      网友评论

          本文标题:编译原理实验,词法分析,LL(1),LR(1)

          本文链接:https://www.haomeiwen.com/subject/bvcoeftx.html