一、产生式
1、产生式
终结符: Number + - * /
非终结符: MultiplicativeExpression AddtiveExpression
<MultiplicativeExpression>::=<Number>|
<MultiplicativeExpression>"*"<Number>|
<MultiplicativeExpression>"/"<Number>
<AddtiveExpression>::=< MultiplicativeExpression>|
<AddtiveExpression>"+"<MultiplicativeExpression>|
<AddtiveExpression>"-"<MultiplicativeExpression>|
2、乔姆斯基谱系
- 0型 无限制文法 --定义左右无限制
- 1型 上下文相关文法 --变化前后(上下)相同
- 2型 上下文无关文法 --左边一个非终结符右边无限制
- 3型 正则文法
JavaScript总体上属于上下文无关文法,表达式部分属于正则文法
特例:乘方右结合2**1**2
二、现代语言特例
- C++中,*可能表示乘号或者指针,具体表示取决于星号前标识符是否被声明为类型
- VB中,<可能是小于号,也可能是XML直接量的开始,取决于当前位置是否可以接受XML直接量
- Python中,行首的tab符和空格会根据上一行的行首空白以一定的规则被处理成虚拟终结符indent或者dedent -- 完全非形式语言
- JavaScript中,/可能是除号,也可能是正则表达式的开头,处理方式类似VB,字符串模板中也需要特殊处理},还有自动插入分号规则
二、语言分类
1、形式语言-用途
-
数据描述语言
json html xaml sal css -
编程语言
c c++ java c# python ruby javascript
2、形式语言-表达方式
-
声明式语言
json html xaml sal css -
命令型语言
c c++ java c# python ruby javascript
3、计算机语言分类
-
数据描述语言:存储一个纯粹的数据,无法进行编程,JSON, HTML, XAML, SQL, CSS
-
编程语言:可进行编程,C, C++, Java, C#, Python, Ruby,Perl
-
声明式语言:结果是怎样的,JSON,HTML,XAML,SQL,CSS
-
命令型语言:达成结果的步骤,C,C++,Java,C#,Python,Ruby,Perl,JavaScript
命令式面向对象语言:C++
.NET平台主语言:C#
关联列表函数式面向对象脚本语言:Lua
虚拟机面向对象语言:Java
面向对象解释式脚本语言:Python
纯面向对象解释式脚本语言:Ruby
Web服务器脚本语言:PHP
浏览器脚本语言:JavaScript
脚本语言:Perl
三、编程语言的性质
1、图灵完备性
图灵在研究数学可计算性概念提出
直观表述:所有可计算的问题都可用来描述的,这样的语言就是具备图灵完备性。
固定模式产生图灵完备性:
- 命令式-图灵机(goto,if while)
- 声明式-lambda(递归)
2、动态和静态
2.1、动态
- 在用户的设备上/在线服务器上
- 产品实际运行时
- Runtime
2.2、静态
- 在程序员设备上
- 产品开发时
- Compiletime
3、类型系统
- 动态类型系统 (用户) 静态类型系统 (开发)
- 强类型 类型转换不默认发生 弱类型 (JavaScript中number+string=string;boolean=》number再和string作对比)
- 复合类型((T1,T2) => T3)
- 子类型-c++ 类型转换默认行为:能用父类型的地方都能用子类型
- 泛型 类型当成参数传递给某一段代码结构 可能是类可能是函数
Array是一个接受泛型的数组
那么凡是能用Array<Parent>的地方,都能用Array<Child>
泛型是Function---协变
那么凡是能用Function<Child>的地方,
都能用Function<Parent>---逆变
四、一般命令式编程语言的设计方式
4.1、一般命令式编程语言
4.1.1、原子级
原子级是一个语言的最小组成单位,包含关键字、直接量、变量名等基本单位
例如:变量名;1234这种字符串或者数字的直接量
4.1.2、表达式
定义:原子级 + 运算符 + 辅助符号
4.1.3、语句
定义:表达式 + 特定标识符 + 特定关键字 + 特定符号 形成一定的结构