、源代码的单词及其种别码如下: 类别 单词 编码 关键字 if 1 then 2 do 3 while 4 begin 5 end 6 标识符 以字母开头,后跟字母或者数字 7 常数 所有非负整数 8 运算符 + 9 - 10 * 11 / 12 = 13 > 14 < 15 界符 ; 16 ( 17 ) 18 { 19 } 20 2、采用你熟悉的语言编写,编写能够识别上面单词的词法分析程序。
时间: 2023-07-16 12:12:54 浏览: 258
这里提供一个Python实现的词法分析程序示例:
```python
# 定义关键字和对应的编码
keywords = {
'if': 1,
'then': 2,
'do': 3,
'while': 4,
'begin': 5,
'end': 6
}
# 判断一个字符串是否是标识符
def is_identifier(word):
if not word.isalpha():
return False
return True
# 判断一个字符串是否是常数
def is_constant(word):
try:
int(word)
return True
except ValueError:
return False
# 定义运算符、界符和对应的编码
operators = {
'+': 9,
'-': 10,
'*': 11,
'/': 12,
'=': 13,
'>': 14,
'<': 15
}
delimiters = {
';': 16,
'(': 17,
')': 18,
'{': 19,
'}': 20
}
# 词法分析函数
def lex(input_string):
tokens = [] # 存储识别出的token
i = 0 # 当前读取到的位置
while i < len(input_string):
c = input_string[i] # 当前读取到的字符
if c in operators: # 如果是运算符
tokens.append((operators[c], c)) # 添加到token列表
i += 1
elif c in delimiters: # 如果是界符
tokens.append((delimiters[c], c)) # 添加到token列表
i += 1
elif c.isalpha(): # 如果是字母,可能是关键字或标识符
word = c
j = i + 1
while j < len(input_string) and (input_string[j].isalpha() or input_string[j].isdigit()):
word += input_string[j]
j += 1
if word in keywords: # 如果是关键字
tokens.append((keywords[word], word)) # 添加到token列表
else: # 如果是标识符
tokens.append((7, word)) # 添加到token列表
i = j
elif c.isdigit(): # 如果是数字,可能是常数
word = c
j = i + 1
while j < len(input_string) and input_string[j].isdigit():
word += input_string[j]
j += 1
tokens.append((8, word)) # 添加到token列表
i = j
else: # 如果是其他字符,忽略掉
i += 1
return tokens
```
上面的`lex`函数接受一个字符串作为输入,返回一个二元组的列表,每个二元组表示一个token,第一个元素是该token的编码,第二个元素是该token的字符串表示。例如,对于输入字符串`"if x > 0 then y = 1; end"`,输出结果为:
```
[(1, 'if'), (7, 'x'), (14, '>'), (8, '0'), (2, 'then'), (7, 'y'), (13, '='), (8, '1'), (16, ';'), (6, 'end')]
```
阅读全文