تبدیل گرامر منظم به ماشین حالت
از یک گرامر منظم (قاعدههایی مثل A → aB) ماشین حالت معادل میسازد: هر ناپایانه یک حالت و هر قاعده یک یال؛ بعد رشتهای را روی آن امتحان میکند.
در گرامر منظم (خطی راست) هر قاعده یا A → aB است (نماد a و رفتن به ناپایانهی B) یا A → a (نماد آخر). این دقیقاً شکل یک ماشین حالت است:
- زمان:
O(rules + |w| · edges) - حافظه:
O(rules) - جانسونباو، فصل ۱۲
- گریمالدی، فصل ۶
S → aS | bA، A → bA | b: رشتههایی با چند a و بعد دستکم دو b. aabb در زبان هست.
def grammar_to_automaton(rules, w):# rules like "S=aA|b;A=bS": capital letters are nonterminals, small letters terminals.# Each rule A → aB becomes an edge A --a--> B, and A → a an edge A --a--> F (the final state).states = []edges = []for rule in rules.split(";"):if "=" not in rule:return Nonelhs, rhs = rule.split("=")if lhs not in states:states.append(lhs)for option in rhs.split("|"):target = option[1] if len(option) > 1 else "F"edges.append([lhs, option[0], target])states.append("F")# Run the automaton on w, keeping every state it could be in.current = [states[0]]for i in range(len(w)):reached = set()for s, a, t in edges:if s in current and a == w[i]:reached.add(t)current = sorted(reached)accepted = "F" in currentreturn accepted
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
Call stack
- grammar_to_automaton()خط 1
توضیح
ایده
در گرامر منظم (خطی راست) هر قاعده یا A → aB است (نماد a و رفتن به ناپایانهی B) یا A → a (نماد آخر). این دقیقاً شکل یک ماشین حالت است:
- هر ناپایانه یک حالت؛ نماد شروع، حالت شروع است.
A → aBیعنی یالA --a--> B.A → aیعنی یالA --a--> FکهFحالت پایانی تازه است.
رشتهای در زبان گرامر است اگر و فقط اگر ماشین با خواندنش از حالت شروع به F برسد. پس گرامرهای منظم و ماشینهای حالت متناهی دقیقاً یک دسته زبان را توصیف میکنند.
ورودی
قاعدهها با ; جدا میشوند و گزینهها با |: مثلاً S=aS|bA;A=bA|b. حرف بزرگ ناپایانه و حرف کوچک پایانه است. ماشین ممکن است ناقطعی باشد، پس همزمان مجموعهای از حالتها دنبال میشود.