深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

大咖助阵|海纳:C 语言是如何编译执行的?(二)

循环语句
分支语句
变量定义
不能处理左递归
非终结符转换为函数
直观、易读易维护
工具:yacc、javacc等
分析方向:从左向右
归约方向:从右向左
无语法错误的判断依据
源文件归约到顶级规则
归约:反向使用规则
推导:正向使用规则
继续讲解C语言程序编译的基本步骤
完整代码示例:gitee仓库链接
实现小型C语言解释器
定义C语言的文法
转换为字节码或其他中间表示
生成AST进行分析和变换
不直接求值运算
遍历AST:验证和转换表达式
结点类型:加减乘除运算和整数
递归函数调用的记录
表达式转换为树形结构
自顶向下(递归下降)
自底向上(LR算法)
编程语言解析
推导与归约
定义语言的产生规则
重要性:理解原理以自由修改算法实现
处理格式化文本的技术
应用于编译器、JSON/XML文件解析等
描述语言产生规则
下一节课预告
资源
课后练习
编译器中的文法分析
抽象语法树(AST)
分析方法
文法分析步骤
文法分析概述
编译过程基本步骤之文法分析

该思维导图由 AI 生成,仅供参考

你好,我是海纳。
上节课,我整体介绍了编译过程包含的几个基本步骤:预处理、词法分析、文法分析、语义分析、中间表示的优化,以及目标文件生成等。然后,我又重点介绍了预处理和词法分析。那按照先后顺序,这节课我们继续来看文法分析。
文法分析技术不只用于编译器中,在 JSON 文件解析、XML 文件解析等场景中也被广泛地使用,它其实是一种处理格式化文本的技术。所以学习这节课,你要掌握的不仅是文法分析的具体技术,更重要的是要理解它处理格式化文本的原理。只有深刻地理解了原理,我们才能做到在具体的场景中,根据需要自由地修改算法的实现。
接下来,我们就具体看看文法分析吧。

文法分析

文法,或者叫语法(Grammar),它描述了一套语言的产生规则。例如,一个合法的句子包含主语、谓语和宾语。那么,我们就可以这样定义句子的规则:
其中,Sent 代表一个句子,S 代表主语(Subject),P 代表谓语(Predicate),O 代表宾语(Object)。上述公式可以这么理解:句子可以推导成主语加谓语加宾语的结构。
主语则可以进一步定义成具体的人。例如,Tom 或者 Mary,这个定义也可以使用一个公式来表示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了编译过程中的文法分析及自顶向下的分析方法。首先,文章解释了文法的基本概念,包括非终结符和终结符的定义,以及文法规则的推导和归约过程。接着详细讲解了自顶向下的分析方法,通过定义非终结符对应的函数来实现文法规则的匹配。文章还提到了自顶向下分析方法的优点,即代码简洁直观,易读易维护。然而,也指出了该方法无法处理左递归的限制,并提出了将左递归文法改写成右递归文法的解决方案。最后,文章提到了编译器在文法分析阶段通常会将程序翻译成抽象语法树(AST),然后再进行进一步的分析和翻译。整体而言,本文内容深入浅出,对于想深入了解编译过程的读者具有很高的参考价值。文章还介绍了抽象语法树的概念,并通过代码示例展示了如何创建和遍历抽象语法树。最后,文章提出了课后练习,鼓励读者尝试定义C语言的文法并实现简单的解释器。文章内容丰富,涵盖了编译过程中的重要步骤和相关概念,适合对编译过程感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 杨宇
    很棒的分析过程!看得出功力深厚
    2022-04-27
    2
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部