當前算符

算符使問題從一種狀態變化為另一種狀態的手段。算符在單獨存在時是沒有什麼意義,在計算機科學中,算符是指運算符號或邏輯符號等。當前算符是指計算機當前要處理運算符,當前算符的選擇一般與運算符優先權和一些其他規則有關。

簡介

在計算機科學中,規定了某種運算的符號稱為算符。算符用於運算對象進行運算,不同算符,所進行的操作是不同的,因此,算符的不同,導致運算對象的運算結果是不同的。當前算符是指計算機正在處理的算符或計算機或程式當前要選擇處理的算符。當前算符現在一般多指計算機或程式要選擇運行的算符。當前算符選擇主要算符優先權和計算機或程式一些設定規則有關。當前算符在很多領域都有套用,例如編譯原理中算符優先分析法。

運算符優先權

在一個表達式中可能包含多個有不同運算符連線起來的、具有不同數據類型的數據對象;由於表達式有多種運算,不同的運算順序可能得出不同結果甚至出現錯誤運算錯誤,因為當表達式中含多種運算時,必須按一定順序進行結合,才能保證運算的合理性和結果的正確性、唯一性。

優先權從上到下依次遞減,最上面具有最高的優先權,逗號操作符具有最低的優先權。表達式的結合次序取決於表達式中各種運算符的優先權。優先權高的運算符先結合,優先權低的運算符後結合,同一行中的運算符的優先權相同。

優先權從上到下依次遞減,最上面具有最高的優先權,逗號操作符具有最低的優先權。

相同優先權中,按結合順序計算。大多數運算是從左至右計算,只有三個優先權是從右至左結合的,它們是單目運算符、條件運算符、賦值運算符。

基本的優先權需要記住:

指針最優,單目運算優於雙目運算。如正負號。

先乘除(模),後加減。

先算術運算,後移位運算,最後位運算。請特別注意:1 << 3 + 2 & 7等價於 (1 << (3 + 2))&7.

邏輯運算最後計算。

算符優先分析法

概述

算符優先分析是一種典型的自下而上的語法分析法, 算符優先分析法的文法基礎是算符文法, 並且嚴格地按終結符的優先關係進行規約,這是算符優先分析法對文法要求的嚴格性。算術表達式在文法的定義上以及優先關係的直觀理解上容易滿足算符優先分析法對文法和優先關係的要求, 所以人們通常把算符優先分析法用在算術表達式的語法分析上, 而對於其它形式文法由於其難以直接滿足條件而較少套用。

算符優先分析法是指它只考慮算符(終結符)之間的優先關係,分析掃描每個規約式的算符間優先關係。算符優先分析法的關鍵是比較兩個相繼出現的終結符號的優先權而決定應採取的動作。要完成算符間的優先權比較,就要先定義各種可能出相繼出現的運算符的優先權,並將其表示成矩陣形式,在分析過程中通過查詢矩陣元素而得算符間的優先關係。對於任何兩個相繼出現的終結符號a和b具有形式:“…ab…”或 “…aQb…”,Q為非終結符,定義a,b間的如下三種關係為:

1) a〈ba的優先權低於b
2) a=b a的優先權等於b
3) a>b a的優先權高於b
如果a和b在任何情況下不可能相繼出現,則a,b之間無關係。

算符文法

算符文法:即它的任一產生式的右部都不含兩個相繼的非終結符的文法。如果G是一個不含空字元的算法文法,那么只要它的任一對終結符都至多只滿足>,=,<的關係的其中一種,則稱g是一個算符優先文法。< p=""><!--的關係的一種,則稱g是一個算符優先文法。

定義1:設有一文法G,如果G中沒有形如A…BC…的產生式,其中B和C為非終結符號,則稱G為算符文法。
算符文法的產生式右部不包含兩個相繼的非終結符號,保證了兩個運算間只有一個運算元,這正是算符文法所要求的句型。
定義2:設G是一個算符文法,a和b是任意兩個非終結符,A,B,C是非終結符。算符優先關係=、>、<定義如下:
(1)a=b,若且唯若G中含有形如A->…ab…或A->…aBb…的產生式;

(2)a<b, 若且唯若G中含有形如A->…aA…的產生式,而B-〉b…或B->Ab…;

(3)a>b, 若且唯若G中含有形如A->…Bb…的產生式,而B->…a或B->…aA;

算符優先法的構造

算符優先法包含三個要素:算符優先表、棧和分析程式。下面以簡化的表達式文法為例介紹算符優先法的構造過程。簡化的表達式文法 G[E]如下:

E→E+T|T

T→T*F|F

F→i|(E)

當前算符 當前算符

可證明文法 G[E]為算符優先文法。構造文法 G[E]的算符優先表如表1。

算符優先法的分析程式是通用的,其算法如圖下。

k:=1;s[k]:=’#’; /*數組 s[]為棧, k 為棧指針*/

REPEAT

把下一輸入符號讀入 a;

IF s[k]∈V T THEN j:=k ELSE j:=k-1; /*取棧頂運算符*/

WHILE s[j]>a DO /*若棧頂運算符 s[j]的優先權高於讀入運算符的優先權,則說明棧中有句柄,找到句柄進行歸約*/

BEGIN

REPEAT

Q:=s[j];

IF s[j-1]∈V T THEN j:=j-1 ELSE j:=j-2

UNTIL s[j]<Q

把 s[j-1]…s[k]歸約為 N; /*s[j-1]…s[k]為句柄*/

k:=j+1;

s[k]:=N

END;

IF s[j]<a OR s[j]=a THEN /*若棧頂運算符 s[j]優先權低於或等於讀入運算符 a 的優先權,則 a 入棧*/

BEGIN k:=k+1;s[k]:=a END.

UNTIL a=’#’

算符優先析法的錯誤診斷恢復機制的構造使用算符優先法進行語法分析時,出現下面兩種情況,則發生錯誤:

(1) 若棧頂算符與當前輸入符號間不存在優先關係;

(2) 若找到某一句柄,但不存在任一產生式,其右部與此句柄形式吻合。

相關詞條

熱門詞條

聯絡我們