产生式(BNF)
- 用尖括号括起来的名称来表示语法结构名
- 语法结构分成基础结构和需要用其他语法结构定义的复合结构
- 基础结构称为终结符
- 复合结构称为非终结符
- 引号和中间的字符表示终结符
- 可以有括号
- * 表示重复多次
- | 表示或
- + 表示至少一次
通过产生式理解乔姆斯基谱系
- 0型 无限制文法
- ?::=?
- 1型 上下文相关文法
- ?<A>?::=?<B>?(第一个问号叫上文第二个问号叫下文,后面的问号同理)
- 2型 上下文无关文法
- <A>::=?
- 3型 正则文法
- <A>::=<A>?
- <A>::=?<A>(错误写法)
一般来说,JavaScript总体属于上下文无关文法,在特例如{
get a {return 1}
get: 1
}
与 2 ** 1 ** 2中使用上下文相关文法来分析,所以严格意义上来说JavaScript属于上下文相关文法
VB中, < 可能是小于号,也可能是XML直接量的开始,取决于当前位置是否可以接受XML直接量
JavaScript中, / 可能是除号,也可能是正则表达式开头,处理方式类似于VB,字符串模板中也需要特殊处理 } ,还有自动插入分号规则
语言的分类
形式语言--用途
- 数据描述语言
如 JSON,HTML,XAML,SQL,CSS
- 编程语言
如 C,C++,Java,Python,Ruby,Perl,Lisp,T-SQL,Clojure,Haskell,JavaScript
形式语言--表达方式
- 声明式语言
如 JSON,HTML,XAML,SQL,CSS,Lisp,Clojure,Haskell
- 命令型语言
C,C++,Java,C#,Python,Ruby,Perl,JavaScript
图灵完备性
命令式--图灵机
- goto
- if和while
声明式--lambda
- 递归
动态与静态
- 动态
- 在用户的设备/在线服务器上
- 产品实际运行时
- Runtime
- 静态
- 在程序员的设备上
- 产品开发时
- Compiletime
类型系统
- 动态类型系统与静态类型系统
- 强类型与弱类型
String + Number
String == Boolean(最臭名昭著的失败的设计)
- 复合类型
结构体
函数签名
- 子类型
泛型
逆变/协变
凡是能用Array<Parent>的地方,都能用Array<Child>
凡是能用Function<Child>的地方都能用Function<Parent>