invoke调用函数可以把参数写在函数名的后面,就像c中那样
call调用函数之前需要把参数压入堆栈,比invoke要多写几行push语句
参考:
https://bbs.csdn.net/topics/233487
https://www.cnblogs.com/ylj1103030017/p/14283519.html
不能再拆了,作为变量的唯一标志,就像人的姓名一样。
抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无关文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因此,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口。
抽象语法树在很多领域有广泛的应用,比如浏览器,智能编辑器,编译器。
(1)词法分析:文本 -> token列表
(2)语法分析:token列表 -> 语法二叉树
当生成树的时候,解析器会删除一些没必要的标识 tokens(比如:不完整的括号),因此 AST 不是 100% 与源码匹配
的。
解析器100%覆盖
所有代码结构生成树叫做CST(具体语法树)
。
链接:
https://juejin.cn/post/7030457038840791053
https://segmentfault.com/a/1190000016231512
https://juejin.cn/post/7030457038840791053
https://zhuanlan.zhihu.com/p/24756198
部分映射
上面是一个 String 转 Int 的函数,当输入是 Hello 时,是没有相对应的数字的,有着这样的特性的函数,我们会称为 Partial function。 Kotlin 在遇到 Partial function 时,有可能会因为接收到不预期的输入,而丢出一个 Exception 。通常我们会用一些防呆机制或是 try catch 来处理这样的状况。
完全映射
然而在 functional programming 中,我们不喜欢 Partial function,最好是所有的 function 都是 Total function。Total function 是什么呢?就是每一个 input 一定可以对应到 output 的其中一个值,如此一来我们就不会有任何例外发生,像一开始举的两个例子:f(x) = x + 1 与 f(x) = x * x 就是 Total function。
参考:https://www.dazhuanlan.com/flipturn/topics/1873335