在理論計算機科學(TOC)中解釋運算子文法和優先順序分析器
如果文法滿足以下兩個條件,則我們可以說這種型別的文法稱為運算子優先順序文法。
如果 ε 在其右部,則不存在任何產生式規則。
如果兩個非終結符在其右部彼此相鄰,則不存在任何產生式規則。
運算子文法具有以下屬性:任何產生式的右部都不為空,也不包含兩個相鄰的非終結符。
示例
E-> E A E | id
A-> + | *
上述文法不是運算子文法,但我們可以將其轉換為運算子文法,例如 -
E-> E + E | E * E | id
有三種優先順序關係,如下所示 -
| 關係 | 含義 |
|---|---|
| a ⋖ b | a 優先於 b |
| a = · b | a 與 b 具有相同的優先順序 |
| a ⋗ b | a 優先於 b |
優先順序表
| id | + | * | $ | |
|---|---|---|---|---|
| id | ⋗ | ⋗ | ⋗ | |
| + | ⋖ | ⋗ | ⋖ | ⋗ |
| * | ⋖ | ⋗ | ⋗ | ⋗ |
| $ | ⋖ | ⋖ | ⋖ | ⋗ |
優先順序表
示例
輸入字串如下所示 -
id1 + id2 * id3
插入優先順序關係後為 -
$ <· id1 ·> + <· id2 ·> * <· id3 ·> $
基本原理
從左到右掃描字串,直到看到 ·> 並放置一個指標。
從右到左反向掃描字串,直到看到 <·。
這兩個關係 <· 和 ·> 之間的所有內容構成控制代碼。
用產生式的頭部替換控制代碼。
運算子優先順序分析演算法
該演算法如下所示 -
初始化:將 P 設定為指向輸入字串 w$ 的第一個符號。
重複 - 令 b 為棧頂符號,a 為 P 指向的輸入符號。
如果 (a 為 $ 且 b 為 $)
返回
否則
如果 a ·> b 或 a =· b,則
將 a 推入棧
將 P 前進到下一個輸入符號
否則如果 a <· b,則
重複
c -> 彈出棧
直到 (c .> 棧頂)
否則錯誤
結束
示例
| id | + | * | $ | |
|---|---|---|---|---|
| id | ⋗ | ⋗ | ⋗ | |
| + | ⋖ | ⋗ | ⋖ | ⋗ |
| * | ⋖ | ⋗ | ⋗ | ⋗ |
| $ | ⋖ | ⋖ | ⋖ | ⋗ |
使用該演算法構建一個圖。該圖如下所示 -

透過觀察它,我們可以提取優先順序函式,例如 -
| id | + | * | $ | |
|---|---|---|---|---|
| f | 4 | 2 | 4 | 0 |
| g | 5 | 1 | 3 | 0 |
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP