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) i = i + 1
2、缩进问题: 一般默认为4个空格的缩进,可以使用tab键或者空格,但是注意如果使用混乱,可能出现unexcepted indent之类的错误。
3、注释:使用#号,如果是多行注释则是''' XXX '''(头尾三个单引号,注意中英文的区别)。
4、函数定义:def 函数名; 或者利用函数对象的__name__属性: if __name__=="__main__"。
5、正则表达式的使用:
import re : 使用python自己的正则表达式模块,其中有对应的方法。(下面编写了不少正则表达式,可以参考)。这里举常见的一个例子:根据空格分隔字符串:
# -*- 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
词法分析:
是编译原理中第一步需要做的事,将给定的程序或者其他读取,根据词的类别不同,进行分类。即可以理解将一段程序分成一个个的词。
扫描二维码关注公众号,回复:
1751312 查看本文章
![](/qrcode.jpg)
先读取test.c的内容,存进一个列表中, 然后通过和数个正则表达式进行match匹配,从而进行分类。这里分类还是存在一些小的问题,欢迎提出更优的解决方案。谢谢!
待读的代码:
#include <studio.h> int main(int argc, char const *argv[]) { char *str = "String123"; //This is comment /** printf("NULL\n"); */ int floatnum = 123.4.56; // If是语法错误,不做词法错误处理 If(6.4 <= 3E-1){ printf("Yes\n");} 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', 'defalut', 'continue', 'return', 'void', 'static', 'auto', 'enum', 'register', 'typeof', 'volatile', 'union', 'extern'] ''' regex中:*表示从0-, +表示1-, ?表示0-1。对应的需要转义 { 表示限定符表达式开始的地方 \{ () 标记一个子表达式的开始和结束位置。子表达式可以获取共以后使用:\( \) r表示原生字符串。 ''' Keyword = r'(?P<Keyword>(auto){1}|(double){1}|(int){1}|(if){1}|' \ r'(#include){1}|(return){1}|(char){1}|(stdio\.h){1}|(const){1})' #运算符 Operator = r'(?P<Operator>\+\+|\+=|\+|--|-=|-|\*=|/=|/|%=|%)' #分隔符/界符 Separator = r'(?P<Separator>[,:\{}:)(<>])' #数字: 例如:1 1.9 Number = r'(?P<Number>\d+[.]?\d+)' #变量名 不能使用关键字命名 ID = r'(?P<ID>[a-zA-Z_][a-zA-Z_0-9]*)' #方法名 {1} 重复n次 Method = r'(?P<Method>(main){1}|(printf){1})' #错误 \S 匹配任意不是空白符的字符 #Error = r'(?P<Error>.*\S+)' Error = r'\"(?P<Error>.*)\"' #注释 ^匹配行的开始 .匹配换行符以外的任意字符 \r回车符 \n换行符 Annotation = r'(?P<Annotation>/\*(.|[\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) #写入指定文件中 #token.write_file(token.run(line, False), "D:/results.txt") token.lineno += 1
以上就是这篇的全部内容,欢迎提出您的意见。谢谢!