语法分析(递归下降)以及中间代码生成
代码在GitHub上:
https://github.com/lee-geng/B_bianyiyuanli/tree/master
语法分析
一开始我也不是很懂什么是语法分析,但是为了完成实验,还是看了一下过程。可以看到这语法分析,其实是一层一层套用的,程序是由常量说明,变量说明,语句这三部分组成,或者是仅有语句组成。[ ] 中括号括起来的表示可选。那么常量说明是什么呢?它在第二小点,也给出了定义就是由 一个Const, 加上常量定义,或者重复加上(、常量定义)。那么其余的也是如此。
代码详解
#全局的p,用来表示当前读到第几个字符,letter是一个list
#作用是把程序分割成一个 一个块。字母数字是一块,标点是一块,
#结果在letter 里。
def read_string():
global p,letter;
p1=p;
letter='';
for i in range(p,length):
#跳过前导空格和换行,
#一直读到非空格,和换行为止。
if (f_read[i]==' ')|(f_read[i]=='\n') :
p1=p1+1;
else:
break;
break;
flag_alnum=0;
flag_notalnum=0;
for i in range(p1,length):
#因为前面已经跳过空格和换行了
#这里在遇到空格和换行,就停止
if (f_read[i]==' ') | (f_read[i]=='\n'):
break;
else:
if f_read[i].isalnum():
#是否是字母或数字
if flag_notalnum==1:
#前面出现过不是字母和数字。
#那么就需要退出
break;
letter=letter+f_read[p1];
p1=p1+1;
flag_alnum=1;
else:#是标点,;()之类的
if flag_alnum==1:
#前面出现过字母和数字。
#那么就需要退出,标点和他们是分开的。
break
letter=letter+f_read[p1];
p1=p1+1;
flag_notalnum=1;
p=p1;把当前的p 更新到p1
return letter;
例子: api+3+b; 那么经过这个函数就会分成 api,+,3,+,b这5个部分(api是个变量名 )
a+3b;那么经过这个函数就会分成 a,+,3b 。这三个部分。
#读入 要分析的程序 放在f_read里
with open('examplse2.txt', 'r') as f1:
f_read=f1.read()
length = len(f_read);
如下图程序。
#进行分析了。p初始值为0;
def lexer_analysiss():
global p;
while(p<len(f_read)):
read_string()
judge_which()
#分析这个是要进入哪里了。
#是Const,还是Var 还是语句
def judge_which():
if 'Const'==letter:
print("Const_description();")
Const_description();
elif 'Var'==letter:
print("Var_description();")
Var_description();
elif letter[0].isalpha:
print("sentense");
sentense();
else:
print("错误Const");
#Const 语句说明
def Const_description():
read_string()
if is_iden()==1:
#判断是不是标识符,自己写的
print(black,"标识符 ",letter)
read_string();
if letter == '=':
print(black,"赋值符号",letter)
read_string();
if is_number()==1:
print(black,"常量",letter);
read_string();
if letter==',':
print(black,"逗号",letter)
Const_description();#循环调用
elif letter==';':
print(black,"分号",letter)
return 1;
else:
print("常量定义错误")
return 0;
else:
print("常量定义错误");
def Var_descript