python基礎及實現詞法分析器的基本實現

2021-08-20 06:03:24 字數 4413 閱讀 1823

python基礎:

1、list的使用,即列表。定義:list(列表名) = ;如下還有對他的遍歷,這裡的word算是定義了乙個變數去儲存res[i]的值:

# -*- coding: cp936 -*-

if __name__=="__main__":

res =

res = ["hello", "you", "are", "good"]

i = 0

#對列表的遍歷

for word in res:

print("第", i ,"位置的元素", word)

2、縮排問題: 一般預設為4個空格的縮排,可以使用tab鍵或者空格,但是注意如果使用混亂,可能出現unexcepted indent之類的錯誤。

3、注釋:使用#號,如果是多行注釋則是''' *** '''(頭尾三個單引號,注意中英文的區別)。

4、函式定義:def 函式名; 或者利用函式物件的__name__屬性: if __name__=="__main__"。

5、正規表示式的使用:

# -*- coding: cp936 -*-

import re

if __name__=="__main__":

temp = 'aaa bbb ccc ddd eee'

res = re.split('\s+', temp)

print(res)

6、讀寫檔案(使用的是with/ 還可以使用open- read- close):

# -*- coding: cp936 -*-

if __name__=="__main__":

filename = 'd:\demo.txt'

filename2 = 'd:\demo1.txt'

with open(filename, "r") as fin:

res = [line.strip() for line in fin]

print(res)

#for line in fin:

#print(line)

with open(filename2, "a") as fo:

#這裡寫在txt檔案式一行,因為它是按行讀的。

for line in res:

if line:

fo.write(line)

else:

continue

詞法分析:是編譯原理中第一步需要做的事,將給定的程式或者其他讀取,根據詞的類別不同,進行分類。即可以理解將一段程式分成乙個個的詞。

先讀取test.c的內容,存進乙個列表中, 然後通過和數個正規表示式進行match匹配,從而進行分類。這裡分類還是存在一些小的問題,歡迎提出更優的解決方案。謝謝!

待讀的**:

#include int main(int argc, char const *argv)

return 0;

}

#!/usr/bin/python

# -*- coding: cp936 -*-

#ex2.py

import re

class token(object):

#初始化

def __init__(this):

#儲存分詞的列表

this.results =

#行號this.lineno = 1

#關鍵字

this.keywords = ['auto', 'struct', 'if', 'else', 'for', 'do', 'while', 'const',

'int', 'double', 'float', 'long', 'char', 'short', 'unsigned',

'switch', 'break', 'de****t', 'continue', 'return', 'void', 'static',

'auto', 'enum', 'register', 'typeof', 'volatile', 'union', 'extern']

'''regex中:*表示從0-, +表示1-, ?表示0-1。對應的需要轉義

|(double)|(int)|(if)|' \

r'(#include)|(return)|(char)|(stdio\.h)|(const))'

#運算子

operator = r'(?p\+\+|\+=|\+|--|-=|-|\*=|/=|/|%=|%)'

#分隔符/界符

separator = r'(?p[,:\{}:)(<>])'

#數字: 例如:1 1.9

number = r'(?p\d+[.]?\d+)'

#變數名 不能使用關鍵字命名

id = r'(?p[a-za-z_][a-za-z_0-9]*)'

#方法名 重複n次

method = r'(?p(main)|(printf))'

#錯誤 \s 匹配任意不是空白符的字元

#error = r'(?p.*\s+)'

error = r'\"(?p.*)\"'

#注釋 ^匹配行的開始 .匹配換行符以外的任意字元 \r回車符 \n換行符

annotation = r'(?p/\*(.|[\r\n])*/|//[^\n]*)'

#進行組裝,將上述正規表示式以邏輯的方式進行拼接, 按照一定的邏輯順序

# compile函式用於編譯正規表示式,生成乙個正規表示式物件

this.patterns = re.compile('|'.join([annotation, keyword, method, id, number, separator, operator, error]))

#讀檔案

def read_file(this, filename):

with open(filename, "r") as f_input:

return [line.strip() for line in f_input]

#結果寫入檔案

def write_file(this, lines, filename = 'd:/results.txt'):

with open(filename, "a") as f_output:

for line in lines:

if line:

f_output.write(line)

else:

continue

def get_token(this, line):

#finditer : 在字串中找到正規表示式所匹配的所有字串, 並把他們作為乙個迭代器返回

for match in re.finditer(this.patterns, line):

#group():匹配的整個表示式的字元 # yield 關鍵字:類似return ,返回的是乙個生成器,generator

yield (match.lastgroup, match.group())

def run(this, line, flag=true):

for token in this.get_token(line):

if flag:

print ("line %3d :" % this.lineno, token)

'''else:

yield "line %3d :" % this.lineno + str(token) + "\n"

'''def printrun(this, line, flag = true):

for token in this.get_token(line):

if flag:

print ("lines x: ", token)

if __name__=='__main__':

token = token()

filepath = "d:/test.c"

lines = token.read_file(filepath)

for line in lines:

token.run(line, true)

#寫入指定檔案中

以上就是這篇的全部內容,歡迎提出您的意見。謝謝!

編譯原理基礎 詞法分析

一 概述 詞法分析是編譯的第乙個階段。詞法分析器的作用是讀入源程式的輸入字元,將他們組成詞素,生成並輸出乙個詞法單元序列,這個詞法單元序列被輸入到語法分析器進行語法分析。另外,由於語法分析器在編譯器中負責讀取源程式,因此,除了識別詞素,它還會完成一些其他任務,比如,過濾掉源程式中的一些注釋和空白,將...

python等縮排語言的詞法分析實現

python等縮排語言的詞法分析實現 定義兩個虛擬的token tokens 還有乙個縮排棧,用於確定是縮排一行,還是回退一行 stack indentstack new stack 在開始做詞法分析之前,壓入乙個預設的indent,這一步其實沒什麼必要,只是用來避免寫判斷棧頂是否為空的冗餘判斷 i...

python表示式詞法分析 詞法分析器

前言 在這一系列文章中,我們將會使用python語言來實現pl0編譯器。首先我們來實現編譯器中的詞法分析的功能。我們使用正規表示式來對源程式的程式語句篩選為 關鍵字keywords,數字numbers,變數variables,分隔符separatores和運算子operatores五種類別。詞法分析...