[课业] 11 | C++ | 语言

语言的三要素

语言有三要素:语法(Syntax)、语义(Semantics)、语用(Pragmatics)

语法(Syntax)

语法是用规则表示语言的组成方式
C++中,与其他语言相同,用EBNF语法图表示语法

Bakus-Naur范式

范式的表示
  1. 形式化描述程序设计语言的语法(从自然语言梳理出来)
    如:
    thank sb. for sth.
    这是一个pattern,其中sb.和sth.是非语言的一部分,这是为了描述pattern引入的;thank与for是语言的一部分(切实的就是本人)
    这种对pattern的描述就实现了用简单形式代表一个集合
    这种pattern在程序设计语言中就是EBNF
    例:
    ID ::- _A_D
    A ::- a|b
    D ::- 1|0
    这就是一个规则,约束了ID;所有能形成的ID是这样几个:_a_1, _a_0, _b_0, _b_1
    规则中:ID是目标的标识符(类似变量名);符号“::-”表示“定义为”,意为“规则的表示方法”
  2. 此例中,用这三条规则代表的是一个有限的字符串集合;若要表示一个无限集合(即用有限的规则表示无限集合)用递归定义
    如:
    ID ::- _A_D
    A ::- aA|bA|A
    D ::- 0|1
  3. 依旧此例
    ID,A,D等不会出现在集合里,他们只是为了描述该语言来描述的引入,成为非终极符号,表示时通常用<>括起来,如
    <ID> ::- _<A>_<D>
  4. 终极符号又称字母表;组词、组句的规则就是语法规则
  5. 完整形式

    非终极符号用{VN}表示
    终极符号用{VT}表示
    整个集合{VN} U {VT}为BNF对应的语言表示
系统对范式的识别

采用方法:规则替换
即遇到任何一个符号串,机器就根据给出的规则不断用右部替换左部,最终形成一棵树;如果该树的根即为目标Identifier,即认为该字符串为符合规则的串
如果是从下往上处理,称为reduce
如果是从上往下递归处理,称作deduct

例:_a_0是否为上述语言的一部分?
如上图,可知_a_0是上述语言的一部分

EBNF示例(与正则有些类似)

Avram Noam Chomsky的语言系统

  1. 观点:自然语言可以用严格形式表示,语法结构可以推演
  2. 55年论文:将人类所有的自然语言分成4个部分
    G = { VN, VT, P, Z }
    VN代表非终极符号集
    VT代表字母表(在程序设计语言中基本同于ASCII)
    P代表转换式规则
    Z代表目标,即Identifier
  3. 语法表示可以分为4类
    详细资料参见1,或参见2
    RG(Regular Grammar):正则文法
    CFG(Context Free Grammar):上下文无关文法
    CSG(Context Sensitive Grammar):上下文有关文法
    PSG(Phrase Structure Grammar):短语结构文法
  4. 对于每种语法,都定义了一种自动识别模型
    RG-FA(Finite Automata)(有限状态自动机)
    CFG-PDA(PushDown Automata)
    CSG-LBA(Linear Bounded Automata)
    PSG-TM(Turing machine)
    注:这些的意思是:“RG语法用FA来识别”
            PushDown Automata识别时用栈结构,有缓冲过程,对应模型叫Stack-Based
  5. 程序设计语言在此语言系统
    程序设计语言语法在是RG,整体文法是CFG,还有一些越过CFG进入CSG
    按照(RG, CFG, CSG, PSG)的顺序,语言的规则约束越来越弱,内涵越来越少,外延越来越大,语言范畴越来越大
  6. 不能用CFG描述的部分,如先定义后使用原则,调用函数参数与定义时参数一致原则等
    这样的语法部分超过了CFG的范围,但不一定用LBA来识别,而使用ad hoc来识别
    注:ad hoc是拉丁的"for this",引用为“for this purpose only",意为(在此情景中)特殊情况出现时,不一定要更强大的自动机来识别(因为自动机越强,系统复杂度越高),而是特殊情况特地解决就好

如何科学地定义语言

  1. 语言是在一个特定的字母表上,按照一定的规则所组成的符号串集合
  2. 语言的大小、强弱与语法紧密相关(语法分级参照Chomsky的系统)
  3. 机制拓展:如通讯协议的表示也可以看作语言(收、发遵循的符号(字母表)排列顺序),组成方式(语法)……

语义(Semantics)

  1. 语义分为动态语义(Dynamic Semantics)与静态语义(Static Semantics),说明了一段话代表的含义是什么
  2. 如上例,程序设计语言中,一些全局的文法已经超过了CFG范围,如先定义后使用原则;这些被归结到静态语义里去
    动态语义:程序执行行为(如计算子)
  3. 计算机中的动、静:程序在运行之前能做的事都是静态,程序编译时、程序未形成前能确定的形式都称为静态
  4. 语义也有严格的表示,可分为三类:操作语义、指称语义、公理语义

语用(Pragmatics)

  1. 定义:语言设计中用什么样的方式表示更为容易被接受,某机制的原理与设计思路等问题





___Fin___
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值