手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7534 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

06|怎么支持条件语句和循环语句?

你好,我是宫文学。
我们现在的语言已经支持表达式、变量和函数了。可是你发现没有,到现在为止,我们还没有支持流程控制类的语句,比如条件语句和循环语句。如果再加上这两类语句的话,我们的语言就能做很复杂的事情了,甚至你会觉得它已经是一门比较完整的语言了。
那么今天,我们就来加上条件语句和循环语句。在这个过程中,我们会加深对作用域和栈桢的理解,包括跨作用域的变量引用、词法作用域的概念,以及如何在运行时访问其他作用域的变量。这些知识点会帮助你加深对计算机语言的运行机制的理解。
而这些理解和认知,会有助于我们后面把基于 AST 的解释器升级成基于字节码的解释器,也有助于我们理解编译成机器码后的运行时机制。
好了,首先我们先从语法层面支持一下这两种语句。

语法分析:支持一元表达式

按照惯例,我们首先要写下新的语法规则,然后使用 LL 算法来升级语法分析程序。新的语法规则如下:
ifStatement
: If '(' expression ')' statement (Else statement)?
;
forStatement
:For '(' expression? ';' expression? ';' expression? ')' statement
;
statement:
: block
| functionDecl
| varaibleStatement
| expressionStatement
| returnStatement
| ifStatement
| forStatement
| emptyStatement
;
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了在编程语言中实现条件语句和循环语句的支持,介绍了相应的语法层面的方法。作者详细讨论了if语句和for循环语句的语法规则,以及一元运算的支持。此外,还涉及了作用域、栈桢和运行时访问其他作用域变量的理解。文章还对不同语言对块作用域的规定进行了比较,并探讨了语义分析程序在处理块作用域时的复杂性。最后,提出了数流分析框架的原理,并强调了在引用消解中的两个语义规则。总的来说,本文内容涉及了语法分析和一元运算的升级,为读者理解编程语言的语法和语义提供了重要的参考。 在技术层面,文章介绍了如何在解释器中实现if语句和for循环语句的执行逻辑,以及对块作用域的理解和处理。此外,还提供了一个计算斐波那契数列的示例程序,展示了函数的递归调用。在支持流程控制类语句的过程中,对块作用域的理解成为重要知识点,不同语言在块作用域上的特性不同,需要采用不同的算法来做引用消解。另外,为了支持For循环,还增加了对一元运算符的支持,这些内容对读者理解编程语言的语法和语义具有重要意义。 总的来说,本文内容涵盖了编程语言的语法分析和一元运算的升级,为读者提供了丰富的技术知识和实用的示例,有助于读者加深对编程语言的理解和应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 奇想天外
    第六章里面还不支持数组和对象吧?

    作者回复: 还不支持。这两个都放在比较后面。

    2021-09-04
  • ifelse
    学习打卡
    2022-09-12归属地:浙江
  • 奇想天外
    //今年才18 let myAge:number = 18; let array2:number; //转眼10年过去 myAge = myAge + 10; let a:number; let b:number; a = 11; b = 10; myAge = b = a; println("myAge is: "); println(myAge); // 这里报错 return arg.toString(); TypeError: Cannot read property 'toString' of undefined
    2021-09-05
  • 有学识的兔子
    对于for循环语句,一般包含两层作用域,一个作用域是用于循环表达式,另一个作用域是内嵌的循环体(函数调用或者表达式)。
    2021-08-29
  • 崔伟协
    似乎需要重新编译ts到js,执行node play fib.ts才能成功
    2021-08-20
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部