Pascal 語法分析器 簡易實現

2021-10-22 17:18:15 字數 3695 閱讀 8907

目錄前言

一、實現內容

二、實現準備

1.詞法分析器

2.自上而下的語法分析(理論)

三、**節選

四、測試截圖

此文僅筆者學習記錄,並不是多麼高深的東西,而且離完成也過了一段時間(不小心給忘了,汗),不過非常歡迎各種指導建議

pascal語言子集(pl/0)詞法分析器的設計與實現

pl/0語言的bnf描述(擴充的巴克斯正規化表示法)

→ program ;→ → const ;

→ :=→ var ;

→ procedure ([);

→ begin end

→ := |if then [else ]

|while do |call ()

||read ()

|write ()

→ |odd → [+|-]{}

→ {}

→||()

→ =|<>||>=

→ +|-

→ *|/

→ l (注:l表示字母)

→ d注釋:

:程式 ;:塊、程式體 ;:常量說明 ;:常量;

:變數說明 ;:分程式 ; :復合語句 ;:語句;

:表示式 ;:條件 ;:項 ; :因子 ;:加法運算子;

:乘法運算子; :關係運算子

odd:判斷表示式的奇偶性。

要求:

使用迴圈分支方法實現pl/0語言的詞法分析器,該詞法分析器能夠讀入使用pl/0語言書寫的源程式,輸出單詞符號串及其屬性到一中間檔案中,具有一定的錯誤處理能力,給出詞法錯誤提示

(需要輸出錯誤所在的行列)

要實現語法分析器必須有詞法分析器,將一整段**分割成不同種別編號的單詞符號

詞法分析器 簡易實現

由於題幹要求以迴圈分支的方式實現,因此需要掌握一定的自上而下的語法分析知識(如果對優化感到很麻煩,可以省略)

"ana_***"即為題幹中對應的***的語法分析子過程

"isid()"函式為變數名函式,即識別使用者自己定義的變數名

「getwordarray()」函式將txt文字中的**進行分割,利用analysis()函式(詞法分析器中有**,稍做了改變,但演算法思想一致)剔除空格識別單詞符號,並儲存進wordarray陣列

fp為文字指標(並非資料型別,只是一種形容),指向當前瀏覽到的char字元

codefile為char陣列,儲存txt文字中的**內容,filelen為codefile陣列的字元個數

readfile為讀檔案函式,得到codefile陣列和filelen

wordnum僅是乙個增量常量(#define wordnum 100)

void concat()

void retract()

void analysis()

retract();

} else if (isdigit())

retract();

} else if (ch == ':')

else if (ch == ';')

concat();

else if (ch == ',')

concat();

else if (ch == '=')

concat();

else if (ch == '<>')

concat();

else if (ch == '

concat();

else if (ch == '<=')

concat();

else if (ch == '>')

concat();

else if (ch == '>=')

concat();

else if (ch == '+')

concat();

else if (ch == '-')

concat();

else if (ch == '*')

concat();

else if (ch == '/')

concat();

else if (ch == '(')

concat();

else if (ch == ')')

concat();

else if (ch == '\n') }

void getwordarray()

analysis();

if (isusestrtoken())

}walen = wp;

wp = 0;

}void ana_statement()

else

} else if (wordarray[wp] == "if")

}else

} }else if (wordarray[wp] == "while")

ana_statement();

} else if (wordarray[wp] == "call")

if (wordarray[wp] == "(")

wp++;

else

if ((wordarray[wp] == "+") || (wordarray[wp] == "-") || (wordarray[wp] == "(") || isid() || isinteger())

}if (wordarray[wp] == ")")

wp++;

else

} else if (wordarray[wp] == "begin")

ana_body();

else if (wordarray[wp] == "read")

if (isid())

wp++;

else

while (wordarray[wp] == ",")

}if (wordarray[wp] == ")")

wp++;

else

} else if (wordarray[wp] == "write")

ana_exp();

while (wordarray[wp] == ",")

if (wordarray[wp] == ")")

wp++;

else

} else

}

當時沒養成寫注釋的好習慣,如果有什麼問題就在下面問吧,不保證還記得

program ;

const m:=24 ,:=81;

var x,y,z,q,r

procedure multiply(x,y;

var a,b;

begin

a:=x; b:=y; z;

while b>0

begin

if odd b z:=z+a;

a:=2*b*c; b:=b/2

endend

x:=m y:=n;

call multiply);

write(a+b-1,d*c*b*a);

read (a,b

以上為測試**,語言pascal

以下為執行結果,格式為  「行:    第n個詞處發生了***語法錯誤,錯誤原因」

LR 語法分析器

lr語法分析器算是基本完成了,只需要乙個文法定義檔案 syntax 就可以進行對應語言的語法分析,最後形成語法樹。詞法分析是固定的,採用c 的詞法定義。以後將加入動態的詞法分析。壓縮包中檔案的描述 lrtable.exe 是用文法定義檔案 syntax檔案 生成lr動作表檔案 action檔案 使用...

LALR語法分析器

lalr分析器 是一種規範lr分析方法的簡化形式。它可以對上下無關文法進行語法分析。lalr即 l ook ahead lr 其中,look ahead為 向前看 l代表對輸入進行從左到右的檢查,r代表反向構造出最右推導序列。lalr分析器 可以根據一種程式語言的正式語法的 產生式而對一段文字程式輸...

LR語法分析器程式設計

include include include include struct code val const char p const char tnt i etf lr分析表列的字元 const int m 9 0表示出錯,s4用4表示。acc用99表示 r2用 2表示 int col char 列...