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

本文是用C语言构建一个类C语言解释器系列教程的第五部分,重点讲解tryC的语法分析实现,包括代码块、if语句、while语句、赋值语句、定义函数和数组语句、返回语句以及输入输出语句的解析。通过语法分析在解释执行过程中进行条件判断和跳过不必要的语句块。项目源码已上传至GitHub。
摘要由CSDN通过智能技术生成

用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 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值