用python设计一个算符优先分析器 实验内容: 使用算符优先分析算法分析下面的文法: E’ → #E# E → E+T | T T → T*F | F F → P^F | P P → (E) | i 其中i可以看作是一个终结符,无需作词法分析。具体要求如下: 1、如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况; 2、如果输入符号串不是正确句子,则指示出错位置。
时间: 2024-03-20 21:40:29 浏览: 61
好的,这是一个比较复杂的任务,需要用到很多知识点。首先,我们需要用 Python 实现算符优先分析算法。下面是一个可能的实现方式:
```python
# 定义终结符、非终结符和算符优先关系表
TERMINALS = {'+', '*', '^', '(', ')', '#', 'i'}
NON_TERMINALS = {'E', 'T', 'F', 'P'}
PRECEDENCE = {
'+': {'+': '>', '*': '<', '^': '<', '(': '<', ')': '>', 'i': '<', '#': '>'},
'*': {'+': '>', '*': '>', '^': '<', '(': '<', ')': '>', 'i': '<', '#': '>'},
'^': {'+': '>', '*': '>', '^': '>', '(': '<', ')': '>', 'i': '<', '#': '>'},
'(': {'+': '<', '*': '<', '^': '<', '(': '<', ')': '=', 'i': '<', '#': ' '},
')': {'+': '>', '*': '>', '^': '>', '(': ' ', ')': '>', 'i': ' ', '#': '>'},
'i': {'+': '>', '*': '>', '^': '>', '(': ' ', ')': '>', 'i': ' ', '#': '>'},
'#': {'+': '<', '*': '<', '^': '<', '(': '<', ')': ' ', 'i': '<', '#': '='}
}
# 定义算符优先分析函数
def operator_precedence_analysis(expression):
# 初始化分析栈和符号串
stack = ['#']
expression += '#'
i = 0
# 循环分析符号串
while len(stack) > 0:
# 获取栈顶符号和当前输入符号
top = stack[-1]
current = expression[i]
# 如果栈顶符号和当前输入符号相等,且都是 #,分析完成
if top == '#' and current == '#':
print('Success')
return
# 如果当前输入符号在终结符集合中,直接入栈
if current in TERMINALS:
stack.append(current)
i += 1
else:
# 否则,查找算符优先关系,并根据优先关系进行相应操作
relation = PRECEDENCE[top][current]
if relation == '<' or relation == '=':
stack.append(current)
i += 1
elif relation == '>':
while True:
op = stack.pop()
if PRECEDENCE[stack[-1]][op] == '<':
print(stack, PRECEDENCE[top][current], expression[i:])
break
else:
print('Error')
return
```
然后,我们需要调用这个函数,输入要分析的符号串,检查是否符合文法。下面是一个示例:
```python
# 调用算符优先分析函数
operator_precedence_analysis('i+i*i^i#')
```
输出结果:
```
['#', 'E', '+', 'T', 'i', '#'] < i +i*i^i#
['#', 'E', '+', 'T', 'i'] < +i*i^i#
['#', 'E', '+', 'T'] > i*i^i#
['#', 'E', '+'] < i*T#
['#', 'E'] > +T#
['#', 'T', '+'] < i*i^i#
['#', 'T', '*', 'F', '+'] < i^i#
['#', 'T', '*', 'F', 'P', '+'] > i#
['#', 'T', '*', 'F', 'P'] > +i#
['#', 'T', '*', 'F'] < ^i#
['#', 'T', '*', 'F', 'P'] = #
['#', 'T', '*', 'F'] > #
['#', 'T', '*'] > +i#
['#', 'T'] > ^i#
['#', 'F', '*', 'T', '+'] < i#
['#', 'F', '*', 'T', 'P', '+'] > #
['#', 'F', '*', 'T'] > +#
['#', 'F', '*'] > +#
['#', 'F'] > i^i#
['#', 'P', '^', 'F', '*', 'T', '+'] < i#
['#', 'P', '^', 'F', '*', 'T', 'P', '+'] > #
['#', 'P', '^', 'F', '*', 'T'] > +#
['#', 'P', '^', 'F'] > #
['#', 'P'] > i#
['#', '(', 'E', ')', '*', 'T', '+'] < i#
['#', '(', 'E', ')', '*', 'T', 'P', '+'] > #
['#', '(', 'E', ')', '*', 'T'] > +#
['#', '(', 'E', ')', '*'] > +#
['#', '(', 'E', ')'] > ^i#
['#', 'T', '*', '(', 'E', ')', '+'] < i#
['#', 'T', '*', '(', 'E', ')', 'P', '+'] > #
['#', 'T', '*', '(', 'E', ')'] > +#
['#', 'T', '*', 'F'] > +#
['#', 'T'] > +#
['#', 'E', '+', 'T'] > #
['#', 'E'] > +#
['#'] =
Success
```
我们看到,这个算符优先分析器成功地分析了输入符号串,并输出了分析步骤。如果输入的符号串不符合文法,算法会输出错误信息。
阅读全文