2型 上下文无关文法
正则文法
二 产生式(BNF)巴科斯诺尔范式:即巴科斯范式(英语:Backus Normal Form,缩写为 BNF)是一种用于表示上下文无关文法(2型)的语言,上下文无关文法描述了一类形式语言。它是由约翰·巴科斯(John Backus)和彼得·诺尔(Peter Naur)首先引入的用来描述计算机语言语法的符号集。
产生式: 在计算机中指 Tiger 编译器将源程序经过词法分析(Lexical Analysis)和语法分析(Syntax Analysis)后得到的一系列符合文法规则(Backus-Naur Form,BNF)的语句
用尖括号括起来的名称来表示语法结构名
语法结构分成基础机构和需要用其他语法结构定义的复合结构
基础结构终结符
复合结构非终结符
引号和中间的字符表示终结符
可以有括号
*表示重复多次
| 表示或
+表示至少一次
终结符:
Number
+ - * /
非终结符MultiplicativeExpression
AdditiveExpression
BNF 表示的四则运算 加减 乘除
定义一个数字
<Number> = "0" | "1" | "2" .....| "9"
定义一个十进制数
<DecimalNumber> = "0" | (("1" | "2" .....| "9") <Number>* )
加法
<AdditiveExpression> ::= <DecimalNumber> + <DecimalNumber>
<MultiplicativeExpression> :: = <DecimalNumber> | <MultiplicativeExpression> "*" <DecimalNumber> | <MultiplicativeExpression> / <DecimalNumber>
<AdditiveExpression> ::= <MultiplicativeExpression> | <AdditiveExpression> "+" <MultiplicativeExpression> | <AdditiveExpression> "http://www.likecs.com/" <MultiplicativeExpression>
BNF 带括号的四则运算
括号
<PrimaryExpression> = <DecimalNumber> | "(" <LogicalExpress> ")"
+ -
<AdditiveExpression> = <PrimaryExpression> | <AdditiveExpression> "+" <PrimaryExpression> | <AdditiveExpression> "-" <PrimaryExpression>
* /
<MultiplicativeExpression> = <DecimalNumber> | <MultiplicativeExpression> "*" <DecimalNumber> |<MultiplicativeExpression> "http://www.likecs.com/" <DecimalNumber>
四则表达式
<LogicalExpress> = <DecimalNumber> | <LogicalExpress> "||" <AdditiveExpression> | <LogicalExpress> "&&" <AdditiveExpression>
产生式: 在计算机中指 Tiger 编译器将源程序经过词法分析(Lexical Analysis)和语法分析(Syntax Analysis)后得到的一系列符合文法规则(Backus-Naur Form,BNF)的语句
通过产生式理解乔姆斯基谱系0型无限制文法
?:: =? <a> <b> ::= "c" <d>
1型上下文相关法 VB JavaScript Python
?<A> ?::=? <B> ? <a> <b> <c> ::= <a> "c" <b> 只有中间那个可以变
"'''四则运算\n" <LogicalExpress> "'''" = "'''四则运算" ( <LogicalExpress> = <DecimalNumber> | <LogicalExpress> "||" <AdditiveExpression> | <LogicalExpress> "&&" <AdditiveExpression>) "'''"
2型上下文无关法
<A>::=?
3型正则文法(表达式)
<A>::=<A>?
<A>::=?<A> 不正确
JavaScript 总体上属于上下文无关文法 表达式大部分属于正则文法,有两个特例 **(乘方) 是右结合 不属于正则 属于2型
{
get a{ return1},
get:1
}
属于1型文法
三、现代语言的特例
C++中,*可能表示乘号或者指针,具体是哪个,取决星号前面的标示符是否被声明为类型
VB中,<可能是小于号,也可能是XML直接量的开始,取决于当前位置是否可以接受XML直接量
Python中,行首的Tab符和空格会根据上一行的行首空白以一定的规则被处理成虚拟终结符indent或者dedent
JavaScript中,/可能是除号,也可能是正则表达式的开头,除理方式类似于VB,字符串模板中也需要特殊处理},还有自动插入分号
四、编程语言的分类形式语言-用途
数据描述语言 JSON 、HTML、XAML、SQL、CSS
编程语言: C++、C、Java、C#、Python、Ruby、Perl、Lisp、T-SQL、Clojure、Haskel、JavaScript
形式语言-表达方式
声明式语言 JSON 、HTML、XAML、SQL、CSS 、Lisp、Clojure、Haskel
命令型语言: C++、C、Java、C#、Python、Ruby、Perl、T-SQL、JavaScript
五、编程语言的性质 图灵完备性
命令式 -图灵机
goto
if和while
声明式 -lambda
递归
动态与静态
动态:
在用户的设备/在线上服务器上
产品运行时
Runtime
静态
在程序员的设备上
产品开发时
Compiletime
类型系统
动态类型系统与静态类型系统
动态类型系统(JavaScript)
静态类型系统 C++
强类型与弱类型
String + Number
String == Boolean
复合类型
结构体{ a:t1,b:t2}
函数签名 参数类型(列表)和返回值类型 (T1,T2)=>T3
子类型
泛型 逆变与协变
凡是能用Array<Parent> 的地方都能用Array<Child> (协变)
凡是能用Funtion<Child> 的地方都能用Funtion<Parent> (逆变)
一般命令式编程语言的设计方式
Atom(原子级) 最小的组成单位 通常包含关键字 直接量 变量名一些基本的单位称为原子