程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言
生活随笔
收集整理的這篇文章主要介紹了
程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
高級程序設計語言
一、語言概述
1.1 語法 v.s. 語義
- 程序本質上是一定字符集上的字符串
- 語法:一組規則,用它可以形成和產生一個合式(well-formed)的程序
- 定義了程序的形式結構
- 定義語法單位的意義屬于語義問題
- 語義:一組規則,定義一個程序的意義
- 例如 “關于函數調用時參數傳遞方法的描述” 屬于語義定義
1.2 作用域
- 同一個標識符在不同過程中代表不同的名字
- 作用域:一個名字能被使用的區域范圍
- 規則:“最近嵌套原則”
1.3 標識符 v.s. 名字
標識符是語法概念,名字是語義概念。
「標識符」
- 以字母開頭的,由字母數字組成的字符串
「名字」
- 含義:標識程序中的對象
- 意義和屬性:
- 值:單元中的內容
- 屬性:類型和作用域
- 說明方式
- 說明語句明確規定
- int score
- 說明語句明確規定
- 隱含說明
- FORTRAN 以 I,J,K,...,N 為首的名字代表整型,否則為實型
- 隱含說明
- 動態確定
- 走到哪里,是什么,算什么
- 動態確定
- 名字的綁定
- 名字的綁定是指將標識符與所代表的程序數據或代碼進行關聯
- 靜態綁定:發生在編譯過程中,如變量聲明、類型定義、函數定義
- 動態綁定:發生在運行過程中,如多態、虛函數
「二者區別」
- 標識符是語法概念
- 名字有確切的意義和屬性
1.4 左值與右值
賦值語句:A := B
- 名字的左值:該名字代表的存儲單元的地址
- 名字的右值:該名字代表的存儲單元的內容
「簡單判斷」
- 出現在賦值號左邊的值必須具有左值,出現在賦值號右邊的值則必須具有右值。
二、語法描述
2.1 基本概念
- **字母表:**一個有窮字符集,記為
- **字符:**字母表中每個元素
- 字 / 字符串: 上的字(也叫字符串)是指由 中的字符所構成的一個有窮序列
- **空字:**不包含任何字符的序列,記做
- 空字是字符串,不是字符
- 字的全體: 表示 上的所有字的全體,包含空字
- 子集連接(積):
- 的子集 U 和 V 的連接(積)定義為
- n次積
- V自身的n次積記為
- 是 V 的閉包:
- 是 V 的正規閉包:
- 「區別」
- 中始終有空字,但如果V中原來沒有空字,則 中不會有空字
2.2 上下文無關文法
「上下文無關文法 G 的定義 - 四元組」
- 終結符(Terminal)集合,非空
- 非終結符(Noterminal)集合,非空,且
- 文法的開始符號,
- S是特殊非終結符,表示所定義的語言最終感興趣的語法單位,如英語描述中的“句子”,程序語言描述的“程序”
- 產生式集合(有限),每個產生式形式如下
- 表示 “P定義為”
- 開始符 至少必須在某個產生式的左部出現一次
2.3 推導
2.3.1 基本概念
- :直接推出,只能對一個非終結符推導一次
- :被定義為
「*推出 & +推出」
「概念辨析 - 句型 | 句子 | 語言」
「句型、句子推導練習」
- 文法 => 句子
- 句子 => 文法
- 此類題目稍微難一些,需要用遞歸思想來解決,優先考慮最簡結構
2.3.2 語法樹
「最左/右推導」
「語法樹」
2.3.3 二義性
「二義性舉例」
「文法 / 語言二義性」
- 文法二義性:文法存在某個句子對應兩顆不同語法樹
- 文法二義性問題是不可判定問題,不存在一個算法,能在有限步驟中,確切地判定一個文法是否二義
- 但仍然存在很多充分條件可以判定一個文法是非二義的
- 例如一個文法如果屬于 LR 文法,則一定不是二義文法
- 語言二義性:存在一個能推導出該語言的無二義文法
2.4 形式語言
2.4.1 概述
- 喬姆斯基在1956年建立形式語言體系,將文法分為四種類型:0、1、2、3型
- 四種類型唯一區別在于產生式
- 0型(短語文法,圖靈機)
- 1型(上下文有關文法,線性界限自動機)
- 2型(上下文無關文法,非確定下推自動機)
- 3型(正規文法,有限自動機)
- 正規式、正規集
2.4.2 文法對比
- 四種類型文法描述能力比較
- 上下文無關文法 v.s. 正規文法
- 上下文無關文法 v.s. 上下文有關文法
- 上下文無關文法的局限 - 權衡思想
總結
以上是生活随笔為你收集整理的程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 移植 arm 精简,arm li
- 下一篇: 使用python打印数字三角形_11届省