精华内容
下载资源
问答
  • 谷歌C语言解释

    2018-07-16 19:07:14
    谷歌开源的C语言解释器,非常强大,可用于无人机系统解释。 目前已经可以移植到PC平台、STM32嵌入式平台、安卓平台(JNI调用)。
  • 详细介绍C语言解释器的实现和使用,以及在ESP32上运行的浏览器界面
  • xrc C语言解释

    2020-09-23 03:00:19
    xrc C语言解释器,可以解析执行C语言脚本。这是VC6完整的代码。 xrc C语言解释器,可以解析执行C语言脚本。这是VC6完整的代码。
  • 简单的c语言解释器----picoc

    千次阅读 2020-07-27 15:59:45
    简单的c语言解释器----picoc 说明 picoc 是一款google 开发并开源的c语言解释器,类似于lua解释器解释lua脚本语言,picoc可以直接解释C语言源代码。 源码路径 https://gitlab.com/zsaleeba/picoc 编译 下面说明一下...

    简单的c语言解释器----picoc

    说明

    picoc 是一款google 开发并开源的c语言解释器,类似于lua解释器解释lua脚本语言,picoc可以直接解释C语言源代码。

    源码路径

    https://gitlab.com/zsaleeba/picoc

    编译

    下面说明一下在ubuntu上面对picoc的编译。

    编译依赖 libreadline-dev

    sudo apt-get install libreadline-dev
    

    编译安装

    cd picoc
    make all
    

    使用

    交互式模式

    # ./picoc -i
    starting picoc v2.2 beta r2.1
    picoc> printf("hello picoc\n");
    hello picoc
    picoc> int a=10;
    picoc> int b=20;
    picoc> printf("a+b=%d\n",a+b);
    a+b=30
    

    解释c语言代码

    cat testmain.c
    #include<stdio.h>
    
    
    int add(int a,int b)
    {
            return a+b;
    }
    
    int main(void)
    {
            printf("hello picoc\n");
            printf("1");
            printf("2");
            printf("%d\n",add(3,5));
            return 0;
    }
    
    
    # ./picoc testmain.c
    hello picoc
    128
    

    参考

    Picoc C语言解释器的STM32平台移植

    展开全文
  • 在这里和大家分享一个用c语言程序演示的汉诺塔。
  • 简化的C语言解释器设计.pdf
  • C语言解释

    2018-03-25 15:20:41
    使用C#开发的简易C语言解释器。包括词法分析、语法分析、中间代码生成以及解释执行各个部分。
  • C语言解释器的C#源代码。支持char, short, int, float, struct以及指针(不支持函数指针)。支持函数、递归、变参函数以及函数嵌套。支持if, for, while, do/while, switch。不支持goto。
  • Ch,一个C语言解释器,没错,这是一个C语言解释器,不是编译器.对于学习C语言的人很有帮助,还能将它嵌入自己的程序解释执行C语言脚本.
  • 编译原理讨论的是程序设计语言翻译原理、技术及实现,对引导...讨论了编译器及解释器的设计的一般原理,特别讨论了如何应用递归下降分析方法设计简化了的C语言解释器的方法,并对C语言的for语句的处理做了较详细的讨论。
  • 简单C语言解释

    2011-01-08 16:42:58
    简单C语言解释
  • C++脚本解释器支持的运算符包括:赋值运算符、算术运算符、关系运算符、逻辑运算符; C++脚本解释器应支持以下的结构:顺序结构、选择结构、循环结构; 如:if/else switch while for等
  • Delphi 写的C语言解释器.zip
  • Ch,一个C语言解释器,没错,这是一个C语言解释器,不是编译器.对于学习C语言的人很有帮助,还能将它嵌入自己的程序解释执行C语言脚本. Update:之前上传的那个在打开ChIDE时,如果试用期到了ChIDE会自动关闭退出,现在更新...
  • 我们已经成功解析了C语言的语法,接下来我们计划分两步走,一是开发一个C语言解释器,也就是不编译,读取足够的源代码后直接执行。二是开发一个C语言的编译器,将C语言转换为java字节码,然后用java虚拟机来执行...

    本节内容比较复杂,请通过视频查看代码讲解和演示:
    用java开发编译器

    我们已经成功解析了C语言的语法,接下来我们计划分两步走,一是开发一个C语言的解释器,也就是不编译,读取足够的源代码后直接执行。二是开发一个C语言的编译器,将C语言转换为java字节码,然后用java虚拟机来执行编译后的C程序。从这节开始,我们逐步实现解释器的开发。

    要想直接执行C语言代码,我们需要在语法解析的过程中构造一种数据结构,叫语法执行树,其本质上也是一颗多叉树,有了这棵树,我们就可以遍历这个树,然后在合适的节点,执行某种动作,进而实现执行C语言源代码的效果,我们先看看树节点:
    这里写图片描述
    一般来说,每一个非终结符都会对应一个这样的节点,该节点中的Type就是非终结符的类型,Text用来存储解析对象的文本信息,如果解析对象是一个变量,那么Text对应的是变量名字符串,如果解析对象是数字例如123,那么Text的内容就是”123”, Symbol 对应的就是变量的符号对象,Value是对应对象解析后的值,假设该节点对应的是数字123,那么Value的值就是数值123,如果对应的是一个变量,例如int a, 并且变量a的值是1,那么Value的值就是整形数1.Children 指向子节点队列, Production 对应的是相关表达式的序号。

    举个例子,对于语句:

    a + b;

    如果变量a 的值是1,变量b的值是2,该语句对应的语法表达式是:

    BINARY -> BINARY + BINARY

    该表达式的序号是94, 那么这条语句解析后,我们的程序会构造如下的一个树:
    这里写图片描述

    我们看看,给定下面一段代码,编译器是怎么构造一颗完整的执行树的:

    void f() {
    int a;
    int b;
    a = 1;
    b = 2;
    
    b = a + b;
    }

    构造流程如下:
    1: 解析器解析语句 int a; 然后根据表达式STATEMENT->LOCAL_DEFS进行递归,此时解析树构造一个节点类型为STATEMENT:
    这里写图片描述

    2: 解析器接着会根据 STMT_LIST->STATEMENT进行递归,此时生成新节点STMT_LIST, 然后把上面生成的节点当成该节点的子节点:
    这里写图片描述

    3: 解析语句 int b ; 同步骤1,根据表达式STATEMENT->LOCAL_DEF进行递归,然后构造类型为STATEMENT的节点:
    这里写图片描述

    4: 接着根据表达式STMT_LIST -> STMT_LIST STATEMENT递归,同时生成新节点STMT_LIST, 并形成下面形式的树结构:
    这里写图片描述

    5: 接着解析语句a = 1; 先把变量a 读入,然后根据表达式UNARY->NAME进行解析,接着生成一个UNARY的节点:
    这里写图片描述

    6:解析器会根据表达式 BINARY -> UNARY 进行递归,此时再次生成一个新的类型为BINARY的节点,并把上一节点当做自己的子节点:
    这里写图片描述

    7: 继续根据表达式NO_COMMA_EXPR -> BINARY递归,同时生成新节点NO_COMMA_EXPR, 并把上面节点当做子节点:
    这里写图片描述

    8: 读入等号后面的字符1, 它的解析流程跟步骤5,6,7是一样的,因此构造的语法执行树也是一样的:
    这里写图片描述

    9: 此时语句 a = 1; 已经全部读入解析器,于是可以根据表达式:
    NO_COMMA_EXPR -> NO_COMMAR_EXPR EQUAL NO_COMMA_EXPR
    进行推导,并生成新节点,且把步骤7和8生成的节点当做自己的子节点:
    这里写图片描述

    10: 接着根据表达式:
    EXPR -> NO_COMMA_EXPR
    STATEMENT->EXPR SEMI
    STMT_LIST -> STMT_LIST STATEMENT
    进行递归,并构造以下执行树:
    这里写图片描述

    11: 接下来要解析的是语句 b = 2, 解析和树的构造步骤与前面一模一样,所以生成的树结构如下:
    这里写图片描述

    12:接下来该解析语句 a = a + b 了,首先读入变量a,它的解析步骤和前面步骤5,6,7一模一样,因此也构造了相应的树结构:
    这里写图片描述

    节点STMT_LIST* 表示步骤11生成的树的根节点,为了避免图形过于繁杂,我将步骤11所构造的树用该节点来表示。

    13: 接着读入等号后后面的变量a, 变量a 的解析跟步骤5,6是一样的,因此会形成下面的执行树:
    这里写图片描述

    14: 继续读入等号和变量b,b的解析跟步骤13一样,因此生成语法执行树如下:
    这里写图片描述

    15: 此时根据表达式:
    BINARY -> BINARY PLUS BINARY进行递归,生成一个新的BINARY节点,然后将上面生成的节点作为子节点:
    这里写图片描述

    16: 解析器根据表达式:
    NO_COMMA_EXPR -> BINARY 进行递归,同时构造如下执行树:
    这里写图片描述

    17: 继续根据表达式:
    NO_COMMA_EXPR -> NO_COMMA_EXPR EQUAL NO_COMMA_EXPR
    递归,并同理构造执行树:
    这里写图片描述

    18: 接着继续根据一系列表达式进行递归:
    EXPR -> NO_COMMA_EXPR
    STATEMENT -> EXPR SEMI
    STMT_LIST -> STMT_LIST STATEMENT
    最终构造的执行树如下:
    这里写图片描述

    有了这颗语法执行树后,在下一节,我们将看看,如何通过遍历这棵树,实现代码执行的效果。

    展开全文
  • 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的...

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言
    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(2)- 简介和设计
    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(3)- 词法分析
    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法
    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现
    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(6)- 语义分析:符号表和变量、函数

    项目github地址及源码:
    https://github.com/yunwei37/tryC

    tryC的语法分析

    完整的tryC EBNF文法:

    (这里我们用单引号包裹那些在BCNF文法定义中出现但又作为终结符出现的字符)

    exp -> term { addop term }
    term -> factor { mulop factor }
    factor -> number | ( exp ) | Sym | array_name '[' exp ']' | function        // 处理数组单元、函数、变量等
    addop -> + | -
    mulop -> * | /
    
    boolOR = boolAND { '||' boolAND }
    boolAND = boolexp { '||' boolexp }
    boolexp -> exp boolop exp | ( boolOR ) | !boolexp
    boolop -> > | < | >= | <= | ==
    
    statement -> '{' { statement } '}'                                  |       // 语句块
                if-stmt -> if ( exp ) statement [ else statement ]      |       // 选择语句
                while-stmt -> while ( exp ) statement                   |       // 循环语句
                Sym = exp;                                               |       // 赋值语句
                print ( exp );                                           |       // 输入输出语句
                puts ( Str );                                            |
                read ( Sym );                                           |
                return ( exp );                                          |       // 函数的返回语句
                func func_name statement;                                |       // 函数定义    
                array array_name length;                                 |       // 数组定义  
    

    statement的代码实现

    布尔表达式和算术表达式的代码之前已经讲过了,这里看看statement的实现,以及如何在语法分析的同时解释执行:

    这里使用的方法是,对于流程控制语句,在语法分析的时候就进行条件判断,如果if判断失败或者while不进入循环块,就跳过该语句块不进行语法分析、解释执行;

    其中RETURNFLAG用来表示在函数中返回,跳过剩余的语句;statement默认返回0,当有return语句在其中出现时才需要使用返回值。

    代码块:

    在一个statement中通过花括号包含多个语句

    double statement() {
        if (token == '{') {
            match('{');
            while (token != '}') {
                if (RETURNFLAG == statement()) 
                    return RETURNFLAG;
            }
            match('}');
        }
        ....
    

    if语句

    由于tryC解释器是边进行语法分析,边解释执行的,因此如果不需要解释执行执行某一个语句块,就调用函数

    skipStatments()
    

    跳过该语句块,不对其进行语法分析,不解释执行;(在if语句和while语句中使用):

    ...
        else if (token == If) {
            match(If);
            match('(');
            int boolresult = boolOR();
            match(')');
            if (boolresult) {
                if (RETURNFLAG == statement()) 
                    return RETURNFLAG;
            }
            else skipStatments();
            if (token == Else) {
                match('Else');
                if (!boolresult) {
                    if (RETURNFLAG == statement())
                        return RETURNFLAG;
                }
                else skipStatments();
            }
        }
    ...
    
    

    其中skipStatments()的实现如下:

    void skipStatments() {
        if(token == '{')
            token = *src++;
        int count = 0;
        while (token && !(token == '}' && count == 0)) {
            if (token == '}') count++;
            if (token == '{') count--;
            token = *src++;
        }
        match('}');
    }
    

    while语句

    ...
        else if (token == While) {
            match(While);
            char* whileStartPos = src;
            char* whileStartOldPos = old_src;
            int boolresult;
            do {
                src = whileStartPos;
                old_src = whileStartOldPos;
                token = '(';
                match('(');
                boolresult = boolOR();
                match(')');
                if (boolresult) {
                    if (RETURNFLAG == statement()) 
                        return RETURNFLAG;
                }
                else skipStatments();
            }while (boolresult);
        }
    ...
    
    

    赋值语句

    赋值语句的左边可以是数组中间的一个单元,也可以是一个变量,右边是字符串或表达式、字符。

    (在下一篇文章中还会提及具体变量赋值的实现)

    数组需要先定义才能进行赋值。

    ...
        else if (token == Sym || token == ArraySym) {
            symbol* s = token_val.ptr;
            int tktype = token;
            int index;
            match(tktype);
            if (tktype == ArraySym) {
                match('[');
                index = expression();
                match(']');
                match('=');
                if (index >= 0 && index < s->value) {
                    s->pointer.list[index].value = expression();
                }
            }
            else {
                match('=');
                if (token == Str) {
                    s->pointer.funcp = (char*)token_val.ptr;
                    s->type = Str;
                    match(Str);
                }
                else if (token == Char) {
                    s->value = token_val.val;
                    s->type = Char;
                    match(Char);
                }
                else {
                    s->value = expression();
                    s->type = Num;
                }
            }
            match(';');
        }
    ...
    
    

    定义函数语句

    定义函数的时候并不执行函数体,所以同样跳过语句块;

    ...
        else if (token == Func) {
            match(Func);
            symbol* s = token_val.ptr;
            s->type = FuncSym;
            match(Sym);
            s->pointer.funcp = src;
            s->value = token;
            skipStatments();
            match(';');
        }
    ...
    
    

    定义数组语句

    定义数组并分配空间

    ...
        else if (token == Array) {
            match(Array);
            symbol* s = token_val.ptr;
            match(Sym);
            match('(');
            int length = (int)expression();
            match(')');
            s->pointer.list = (double*)malloc(sizeof(struct symStruct) * length + 1);
            for (int i = 0; i < length; ++i)
                s->pointer.list[i].type = Num;
            s->value = length;
            s->type = ArraySym;
            match(';');
        }
    ...
    
    

    返回语句

    返回RETURNFLAG作为标志;

    ...
        else if (token == Return) {
            match(Return);
            match('(');
            return_val = expression();
            match(')');
            match(';');
            return RETURNFLAG;
        }
    ...
    
    

    输入输出语句

    ...
        else if (token == Print || token == Read || token == Puts) {
            int func = token;
            double temp;
            match(func);
            match('(');
            switch (func) {
            case Print: 
                temp = expression();
                printf("%lf\n", temp);
                break;
            case Puts: 
                printf("%s\n", (char*)token_val.ptr);
                match(Str);
                break;
            case Read:
                scanf("%lf", &token_val.ptr->value);
                token_val.ptr->type = Num;
                match(Sym);
            }
            match(')');
            match(';');
        }
        return 0;
    }
    
    

    可对照源码查看(如果觉得写得还行麻烦您帮我点个star哦)
    https://github.com/yunwei37/tryC
    /tryC)

    展开全文
  • C语言解释器的实现--序(零)

    千次阅读 2016-03-05 12:24:55
    特意实现了一个简易的C语言解释器,所谓的解释器,就是它是解析执行脚本文件的,并不产生可执行的目标代码。它具备了C语言的几乎全部的语法。随着时间的推移,我打算把它作为一个独立的项目来开发了。在这个过程中,...

    在写CuteC文本编辑器的同时,为了使之有脚本执行能力。特意实现了一个简易的C语言解释器,所谓的解释器,就是它是解析执行脚本文件的,并不产生可执行的目标代码。它具备了C语言的几乎全部的语法。随着时间的推移,我打算把它作为一个独立的项目来开发了。在这个过程中,自己也学到了不少的知识,所以也打算跟大家分享。写这些东西,虽然是重复发明轮子的事,但也不至于是在浪费生命。程序员嘛,我总觉得应该是要理解我们每天所编译出来的程序是怎么被执行,应该明白我们敲打的每行代码的实际意义。
        我打算写一个系列的文章来说明这个解释器的实现过程,其中对于编译原理的理论知识不做太多的讲解,一是不容易提高大家的积极性,二是自己水平有限。所以我觉得大部分从例子出发,讲解一个个目标的实现过程,大家慢慢体会,估计收获会比较大。
        
        通过这一系列的文章,大家应该可以学到以下的知识。
        1.更深入的理解C的内部细节,对以后的开发总是有好处的。例如,你能很清楚C语言的类型定义,通过基本的类型为何能够定义出无穷的各种类型。
        2.了解表达式的解析,中间代码的产生。这点非常有意思,了解了这点,可以用同样的方法做很多事情,包括设计个计算器,解析复杂的配置文件,在软件中解析命令等等。
        3.对编译器有一个感性的认识,虽然离写出编译器还比较遥远,但对于语法解析,预编译,理解的就比较深入了。现在很多软件都有预编译的模块在里面,比如Pro*C, GSoap等等。
        4.我们产生的中间代码其实已经非常接近汇编代码,这对理解C的执行过程总是有好处的。
        
        总之,晒晒自己的成果,怎么说也是我亲亲苦苦写出来的,希望大家能找到点可以借鉴的东西吧~代码我还在努力的编写,过一段时间再放出来一个初级的版本。如果工作忙,那估计就要再等一段时间了。

        以前我发过上一个版本的解释器,可以在这篇文章中下载,不过我现在已经重写了解释器,所以要看结果可以先下载下来看看:)。



    from: http://www.cnblogs.com/linxr/archive/2011/12/16/2290474.html


    xrc C语言解释器  

    http://download.csdn.net/detail/linxren/4204728




    解释器 Tiny Compiler

    解释器 Tiny Compiler
    http://www.oschina.net/code/snippet_149334_5035

    解释器 Tiny Compiler
    展开全文
  • MuJS 轻量级的js解释器。设计为可以嵌入到其他软件中运行以扩展他们的脚本支持
  • 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1) 项目github地址及源码: https://github.com/yunwei37/tryC 一个小目标 这一系列教程希望面向初学者,使用c语言手工实现一个简单的解释器来玩...
  • 只有140行代码的C语言解释

    千次阅读 2018-02-24 13:42:26
    【 以下文字转载自 CProgramming 讨论区 】 发信人: wax (ooo), 信区: CProgramming 标 题: 只有140行代码的C语言解释器 发信站: 水木社区 (Thu Feb 26 14:57:59 2015), 站内 ... 源码的初始作者是: ...
  • 自己用C语言写的一个简单的XML语法解释器。只考虑XML的基本语法,高级语法没有考虑。
  • C语言解释一下BA无标度网络

    千次阅读 2020-01-30 12:40:56
    我们见识一下胜者通吃的过程中的 胜者 是如何吞噬剩余的世界的,如果能重现这个过程,我们也就能解释为什么这么大个世界被那么几个很少的国家主宰着,同时我们也能理解为什么同为胜者的几个国家必须结盟的原因。...
  • c语言解释

    千次阅读 2018-10-28 20:11:39
    还在羡慕python解释器有交互模式吗,c语言也有一款解释器picoc,它也能解释写好的c语言脚本。 Mac os 安装: brew install picoc 交互模式: 似乎它只能支持一些常规c写法。指针的写法,有的不能运行。。不过...
  • Tiny C Compiler是一个基本符合C99规范的编译器,并且可以支持解释执行,嵌入到您自己的程序中,就可以用C语言编写脚本(源文件)来扩展软件的功能。支持Windows和Linux系统。 源码本来是.tar.bz2,论坛里面不能传这种...
  • 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 项目github地址及源码: ...
  • 们继续锦上添花,为... while的解释执行功能,完成这节后,我们的解释器开发将进入一个重大的里程碑,那就是,他将能解释执行用C语言编写的快速排序算法,进而也表明,我们开发的解释器已经达到了一个比较成熟的地步
  • 一个小语言的解释器的源代码,有不少问题。拿出来供大家批评。 运行环境:MinGW. 欢迎打扰,讨论,以便改进升级。 作者:丁晨*luo(mail:lingling1989r@gmail.com) 不好意思,当初忘记把更新过的给上传了..下面是可以...
  • 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的...
  • #include #include #include #include #include #include #include #define MAX_HOST_LEN 32 /* 主机名最大长度 */ #define MAX_PATH_LEN 256 /* 路径的最大长度 */ #define MAX_COMMAND_LEN 256 /*命令的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 198,911
精华内容 79,564
关键字:

c语言解释

c语言 订阅