前言
在這一系列文章中,我們將會使用python語言來實現pl0編譯器。
首先我們來實現編譯器中的詞法分析的功能。我們使用正規表示式來對源程式的程式語句篩選為:關鍵字keywords,數字numbers,變數variables,分隔符separatores和運算子operatores五種類別。
詞法分析器的輸出是源程式中的單詞和它所對應的類別組成的二元組。
正規表示式
表示式的定義:
例如:'a.':表示匹配以a開頭,後面為除換行符之外任意字元的字串,小點表示任意字元
'a*':表示匹配零個,乙個或者多個a的字串
'a+':表示匹配乙個或者多個a的字串
'a':表示匹配兩個a的字串
'a':表示匹配兩個到三個a的字串
'a[a-z]':表示匹配以a開頭,a到z結尾的字串
' a[a-z] ':表示匹配以空格開頭,結尾的字串,中間為上述字串的格式
' (a[a-z]) ':表示匹配括號內部的字串,括號表示優先順序
' ([aa][a-z]) ':表示匹配以a或者a開頭的字串
' *([aa][a-z]) ':表示以零個或者多個空格開頭的字串,a*表示包含零個,乙個或者多個a的字串
'^0':匹配僅僅在行首的字元0
'0$':匹配僅僅在行末的字元0
'r':表示匹配僅僅以c開頭的,後面跟r的字串
正規表示式相關函式
compile函式:根據乙個模式字串和可選的標誌引數生成乙個正規表示式物件。該物件擁有一系列方法用於正規表示式匹配和替換。
match函式:
match函式的屬性:string:匹配時使用的文字
re:匹配時使用的pattren物件
pos:文字中正規表示式開始搜尋的索引。值與 pattern.match()和 pattern.seach()方法的同名引數相同。
endpos: 文字中正規表示式結束搜尋的索引。值與 pattern.match()和 pattern.seach()方法的同名引數相同。
lastindex: 最後乙個**獲的分組在文字中的索引。如果沒有**獲的分組,將為 none。
lastgroup: 最後乙個**獲的分組的別名。如果這個分組沒有別名或者沒有**獲的分組,將為 none。
math函式的方法:group 函式,獲取乙個或多個分組的字串。
start 函式,返回指定的組截獲的子串在 string 中的起始索引。
end 函式,返回指定的組截獲的子串在 string 中的結束索引。
span 函式,返回指定的組截獲的子串在 string 中的結束索引。
expand 函式,將匹配到的分組代入 template 中然後返回。
注:search方法用來匹配字串中間的資料,而match方法只能從頭開始檢索。
程式設計實現
#引入正規表示式庫
import re
#定義表示式
lines = 0
keywords = r'(?p((const)|(var)|(procedure)|(begin)|(end)|(odd)|(if)' \
r'|(then)|(call)|(while)|(do)|(read)|(write)))'
numbers = r'(?p([0-9]+))'
variables = r'(?p([a-za-z][a-za-z0-9]*))'
operatores = r'(?p(\+|\-|\*|\/|\=|\#|\|>=|:=))'
separatores = r'(?p([,;.)(]))'
#生成乙個正規表示式物件
patterns =re.compile('|'.join([keywords,numbers,variables,operatores,separatores]))
def get_token(text):
for match in re.finditer(patterns, text):
yield(match.lastgroup, match.group())
def token_print(text):
for token in get_token(text):
print("line",lines,":",token)
if __name__ == '__main__':
text = "const a=10;var b='a'"
token_print(text)
yield函式用來返回乙個可迭代物件,在上述例子中,源程式定義為text變數。
lines變數表示為源程式的行數,此處只對一句源程式進行詞法分析。
詞法分析與正規表示式 (一)
嚴格來說,詞法分析是語法分析的一部分。可是將詞法分析從語法分析中抽離出來,有如下好處。1.簡化語法分析器的設計。如果把空白字元和去除注釋這些功能都交給語法分析器來處理,那語法分析器的結構會變得非常簡單。2.提高編譯器效率。編譯器耗時最大的部分消耗在詞法分析階段。因為詞法分析涉及到檔案讀操作。而將詞法...
編譯原理 詞法分析02 正規表示式
r r 正規表示式,表示字串的格式。l r r所匹配的串的集合。symbol符號 l r 中的元素稱為符號。alphabet字母表 表示符號的字元的集合。用 sigma 表示。元字元metacharacter,元符號metasymbol 它們非字母表中的字元,是一些特殊意義的字元,比如,如果要匹配這...
詞法分析程式
上課沒聽啥,一邊看書,一邊做的。基本上,老師的要求是實現了,能把乙個句子 也可以是一整個程式,但還不完善,由於時間急,很多情況來不及考慮了 中的單詞項分析出它是保留字,還是識別符號,運算子等等。開始是在控制台下做得,也比較純正 lex.h ifndef lex h define lex h incl...