一段时间以来,我一直在尝试计算语法的后续集,但又遇到了另一个问题。这是我的跟随集计算器:
def gen_follow_set(grammar, start_sym, first_sets):
follow_sets = {nterm: set() for nterm in grammar}
follow_sets[start_sym].add("$")
for _, prods in grammar.items():
for alt in prods:
for item in alt:
if item.isupper():
follow_sets[item] = set()
while True:
changes = copy.deepcopy(follow_sets)
for nterm, prods in grammar.items():
for alt in prods:
for i, item in enumerate(alt):
la = alt[i + 1] if i + 1 != len(alt) else nterm
if i == len(alt) - 1 and item != "":
follow_sets[item] |= follow_sets[nterm]
elif item != "":
if "" in first_sets[la]:
follow_sets[item] |= first_sets[la].union(
first_sets[alt[i + 2] if i + 2 <= len(alt) -
1 else nterm]) - {""}
else:
follow_sets[item] |= first_sets[la]
if changes == follow_sets:
return follow_sets
这被称为:
grammar = {
"expr": [["term", "etail"]],
"term": [["LPAREN", "expr", "RPAREN"], ["INT", "ttail"]],
"etail": [["PLUS", "expr"], [""]],
"ttail": [["TIMES", "term"], [""]]
}
first = calc_first_set(...)
pprint.pprint(gen_follow_set(grammar, "expr", first))
etail并且expr是正确的,但term并不ttail正确。我怎样才能得到正确的答案?
慕哥9229398
相关分类