目錄前言
一、實現內容
二、實現準備
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 列...