构造文法G(E):E—>a|b|(T) T—>T+E|T*E|E|c 的预测分析程序
时间: 2023-06-16 11:05:51 浏览: 50
预测分析程序的实现需要以下步骤:
1. 构造文法的预测分析表。
2. 编写程序,读入输入串并进行分析。
3. 在程序中使用栈来进行推导和匹配。
下面是该文法的预测分析表:
| | a | b | ( | ) | + | * | c | $ |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| E | E->a | E->b | E->(T) | | | | E->c | |
| T | | | T->(T) | | T->T+E | T->T*E | T->E | |
其中,终结符为 a、b、(、)、+、*、c 和 $,非终结符为 E 和 T。
以下是一个可能的预测分析程序的实现(使用 Python 语言):
```python
# 预测分析表
predictive_table = {
'E': {
'a': ['E->a'],
'b': ['E->b'],
'(': ['E->(T)'],
')': [],
'+': [],
'*': [],
'c': ['E->c'],
'$': []
},
'T': {
'a': [],
'b': [],
'(': ['T->(T)'],
')': [],
'+': ['T->T+E'],
'*': ['T->T*E'],
'c': ['T->E'],
'$': []
}
}
# 分析栈
stack = ['$'] # 初始为 $,表示输入串结束
input_str = input('请输入待分析的字符串:') + '$' # 输入串并在末尾添加 $
# 预测分析程序
def predictive_parser():
global stack, input_str
# 初始化
stack.append('E')
index = 0
X = stack[-1]
a = input_str[index]
# 分析
while X != '$':
if X == a:
stack.pop()
index += 1
X = stack[-1]
a = input_str[index]
elif X in predictive_table.keys() and a in predictive_table[X].keys() and predictive_table[X][a]:
# 使用预测分析表进行规约
production = predictive_table[X][a][0]
stack.pop()
if production != 'T->E':
for symbol in reversed(production.split('->')[1]):
stack.append(symbol)
X = stack[-1]
else:
print('Error!')
return
print('Success!')
predictive_parser()
```
该程序使用栈来进行推导和匹配,先将 $ 和 E 压入栈中,然后读入输入串并在末尾添加 $。在分析过程中,分析栈中的栈顶元素 X 和输入串中的第一个字符 a 进行比较,如果相等,则将它们都弹出;如果不相等,则根据预测分析表进行规约,将产生式右部的符号依次压入栈中。如果最终栈中只剩下 $,则表示分析成功,否则表示分析失败。