一、构造程序设计语言的描述
<程序>→<类型说明>main(){ <函数体> }
<类型说明>→char|int
<函数体>→<变量声明部分>|<常量定义>|<输入语句>|<条件语句>|<循环语句>|<表达式>|<输出语句><返回语句>
<常量定义>→<类型说明><赋值语句>;|<赋值语句>;
<变量声明部分>→<类型说明><标识符>;
<赋值语句>→<标识符>=<无符号整数>|{<标识符><运算符><标识符>}
<输入语句>→scanf(“%<标识符>”,& <标识符>);
<输出语句>→printf(“%<标识符>”,<表达式>);
<条件语句>→if (<判断语句>){<函数体>}
<循环语句>→while(<判断语句>){<函数体>}
<判断语句>→<标识符><运算符><标识符>|true|false
<表达式>→<标识符>=<标识符><运算符><标识符>
<返回语句>→return<标识符>;
<标识符>→<字母>{<字母>|<无符号整数>}
<字母>→a|b|…|X|Y|Z
<数字>→0|1|…8|9
<运算符>→+ |-|/|*|=|<|>|<=|>=|%|&
<无符号整数>→<数字>{<数字>}
二、内部编码表
三、程序
c语言程序(识别程序)
int main()
{
int a;
int b;
int c;
a=10;
scanf("%d",&b);
while (b==20.1){
b=b-1;
}
if(a<b){
c=a+b;
}
printf("%d",c*a);
return 0;
}
python 程序
import re #正则表达式的库
#保留字,一共包含了c中的7个关键字
key_word = ['int','main','printf','return','whlie','if','scanf']
#运算符和界符
operator = ['(', ')', '{', '}', ',', ';', '"', '%', '&','+', '=', '>', '<', '-', '*' ]
bosy = ['>=','<=','==']
with open('cpp.txt', 'w') as file:
print("请输入需要进行词法分析的源程序:")
#txt = sys.stdin.readlines()
sentinel = '#' # 遇到这个就结束
lines = []
for line in iter(input, sentinel):
lines.append(line)
file.writelines(lines)
with open('cpp.txt', 'r') as file:
#预处理,增加了去除字符串的功能,毕竟字符串肯定不是标识符啊……
txt = ' '.join(file.readlines())
#在一个字符串中替换所有匹配正则表达式的子串,返回替换后的子串
#r代表原始字符串常量,用于处理正则表达式时,规避反斜杠的转义。
#re.sub 实现正则表达式的替换
##去除两边空格
deal_txt = txt.strip()
##替换制表符为空值
deal_txt = deal_txt.replace('\t', ' ').replace('\r', ' ').replace('\n', ' ')
#词法分析,标识符识别规则加入了_
keyword = []
opeword = []
boword = []
idword = []
numword = []
errword = []
#返回string(deal_txt)中所有与pattern(第一个变量)匹配的全部字符串,返回形式为数组。
pha = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*', deal_txt)
num = re.findall(r'\d+\.?\d*e?-?\d*?',deal_txt)
str = re.findall(r'[^\w]', deal_txt)
bo = re.findall(r'>=|<=|==', deal_txt)
for k in pha:
if k in key_word:
keyword.append({k : key_word.index(k) + 1})
else:
#因为前面一共有关键字加函数一共有4个。
idword.append({k : 8})
for n in num:
numword.append({n : 9})
for s in str:
if s in operator:
opeword.append({s: len(key_word) + operator.index(s) + 3})
elif s != ' ':
errword.append({s : 'ERROR'})
for i in bo:
if i in bosy:
boword.append({i: len(key_word) + len(operator) +bosy.index(i) + 3})
print("保留字:\n", keyword)
print("标识符:\n", idword)
print("数字常量:\n", numword)
print("界符和操作符:\n", opeword+boword)
if len(errword) != 0:
print("error:\n", 28)
运行结果