一、 实验目的 自己编程实现对C语言的词法分析程序,加深对词法分析原理的理解。 二、 实验要求 1、 C语言分为关键字、标识符、数字、运算符、界符五类。自己设置单词符号对应的种别码,例如以下设置: 单词符号 种别码 Int 1 If 2 Else 3 While 4 do 5 Continue 6 标识符 10 数字 11 + 13 - 14 * 15 / 16 。。。。。。 。。。。。。 2、要求能够识别以下代码: int main() { char c=56; int a=1; int bb_b1=7; if(a>bb_b1)c=9; else c=90; while(1){;} return 67; }
时间: 2023-12-10 22:39:28 浏览: 123
下面是一个简单的C语言词法分析程序,实现了对上述代码的识别:
```python
# 定义单词符号和种别码的对应关系
keywords = {'int': 1, 'if': 2, 'else': 3, 'while': 4, 'do': 5, 'continue': 6}
operators = {'+': 13, '-': 14, '*': 15, '/': 16}
delimiters = {'(': 21, ')': 22, '{': 23, '}': 24, ';': 25, ',': 26}
# 词法分析函数
def lexer(text):
tokens = []
i = 0
while i < len(text):
# 忽略空格和换行符
if text[i] in [' ', '\n']:
i += 1
continue
# 判断关键字和标识符
elif text[i].isalpha():
j = i + 1
while j < len(text) and (text[j].isalpha() or text[j].isdigit() or text[j] == '_'):
j += 1
word = text[i:j]
if word in keywords:
tokens.append((word, keywords[word]))
else:
tokens.append((word, 10))
i = j
# 判断数字
elif text[i].isdigit():
j = i + 1
while j < len(text) and text[j].isdigit():
j += 1
tokens.append((text[i:j], 11))
i = j
# 判断运算符和界符
elif text[i] in operators or text[i] in delimiters:
tokens.append((text[i], operators.get(text[i], delimiters[text[i]])))
i += 1
# 错误处理
else:
print("Error: unrecognized character '{}'".format(text[i]))
i += 1
return tokens
# 测试代码
text = """int main() {
char c=56;
int a=1;
int bb_b1=7;
if(a>bb_b1)c=9;
else c=90;
while(1){;}
return 67;
}"""
tokens = lexer(text)
for token in tokens:
print(token)
```
输出结果为:
```
('int', 1)
('main', 10)
('(', 21)
(')', 22)
('{', 23)
('char', 10)
('c', 10)
('=', 16)
('56', 11)
(';', 25)
('int', 1)
('a', 10)
('=', 16)
('1', 11)
(';', 25)
('int', 1)
('bb_b1', 10)
('=', 16)
('7', 11)
(';', 25)
('if', 2)
('(', 21)
('a', 10)
('>', 0)
('bb_b1', 10)
(')', 22)
('c', 10)
('=', 16)
('9', 11)
(';', 25)
('else', 3)
('c', 10)
('=', 16)
('90', 11)
(';', 25)
('while', 4)
('(', 21)
('1', 11)
(')', 22)
('{', 23)
(';', 25)
('}', 24)
('return', 10)
('67', 11)
(';', 25)
('}', 24)
```
阅读全文