本题目为LL(1)分析程序第一步,判断各非终结符是否可以推出空 输入格式: 输入一个上下文无关文法,先输入文法产生式条数,再输入各个产生式,字符“ε”用“@”表示 输出格式: 输出各非终结符是否可以推出空,"1"代表可以推出空,“0”代表不可以推出空。输出顺序按文法左部非终结符出现的顺序。 输入样例: 在这里给出一组输入。例如: 9 S->MH S->a H->LSo H->@ K->dML K->@ L->eHf M->K M->bLM 输出样例: 在这里给出相应的输出。例如: S-1 H-1 K-1 L-0 M-1
时间: 2024-02-12 18:04:34 浏览: 261
以下是该题的Python3代码实现:
```python
# 定义一个函数,判断该符号(非终结符)是否可以推出空
def can_derive_empty(symbol, productions, visited):
# 若该符号已经被判断过了,直接返回
if symbol in visited:
return False
# 对于产生式中的每个产生式
for production in productions:
# 如果该产生式的左部是该符号
if production[0] == symbol:
# 如果该产生式可以推出空
if production[1] == '@' or all(can_derive_empty(s, productions, visited | {symbol}) for s in production[1:]):
return True
# 若该符号没有产生式或者所有产生式都不能推出空
return False
# 输入
n = int(input())
productions = []
for i in range(n):
productions.append(input().split('->')[1].strip().split(' '))
# 对于每个符号,判断是否可以推出空
for symbol in sorted(set(s for p in productions for s in p[1:]) | {p[0] for p in productions}):
if can_derive_empty(symbol, productions, set()):
print(symbol + '-1')
else:
print(symbol + '-0')
```
阅读全文