call vs Invoke
invoke调用函数可以把参数写在函数名的后面,就像c中那样
call调用函数之前需要把参数压入堆栈,比invoke要多写几行push语句
参考:
https://bbs.csdn.net/topics/233487
https://www.cnblogs.com/ylj1103030017/p/14283519.html
Identifier(标志)
不能再拆了,作为变量的唯一标志,就像人的姓名一样。
Syntax(语法)
- Concrete Syntax(AST),是你看得见的东西
- Abstract Syntax(CST),是Evaluator等东西接受的数据结构
- 简称 语法树 (Syntax tree)
- 是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,
- 之所以说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。
抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无关文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因此,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口。
抽象语法树在很多领域有广泛的应用,比如浏览器,智能编辑器,编译器。
文本 -> 抽象语法树的过程
(1)词法分析:文本 -> token列表
- 去除空格,对token分类,去除空格,然后对token分类,那些属于语法关键字,那些属于操作符,那些属于语句的截止位置,那些属于数据
(2)语法分析:token列表 -> 语法二叉树
- 扫描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
Partial function and total function
部分映射
上面是一个 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。
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。