
see More Picture if you
liked that one.
| NFA | DFA | a | b |
|---|---|---|---|
| {0} | A | B | |
| {1,2,3,5,8} | B | C | D |
| {2,3,4,5,7,8,9} | C | C | D |
| {2,3,5,6,7,8} | D | C | D |
| NFA | DFA | a | b |
|---|---|---|---|
| {0,1,2,4,7} | A | B | C |
| {1,2,3,4,6,7,8,9,11} | B | D | E |
| {1,2,4,5,6,7} | C | B | C |
| {1,2,3,4,6,7,8,9,10,11,13,14,16} | D | F | G |
| {1,2,4,5,6,7,12,13,14,16} | E | H | I |
| {1,2,3,4,6,7,8,9,10,11,13,14,15,16,18} | F | F | G |
| {1,2,4,5,6,7,12,13,14,16,17,18} | G | H | I |
| {1,2,3,4,6,7,8,9,11,15,18} | H | D | E |
| {1,2,4,5,6,7,17,18} | I | B | C |
| state | a | b | ε |
|---|---|---|---|
| 0 | {0,1} | {0} | ∅ |
| 1 | {1,2} | {1} | ∅ |
| 2 | {2} | {2,3} | {0} |
| 3 | ∅ | ∅ | ∅ |
| state | a | b | ε |
|---|---|---|---|
| 0 | {1} | ∅ | {3} |
| 1 | ∅ | {2} | {0} |
| 2 | ∅ | {3} | {1} |
| 3 | {0} | ∅ | {2} |
| state | a | b | ε |
|---|---|---|---|
| 0 | ∅ | ∅ | {1,2} |
| 1 | {2} | ∅ | ∅ |
| 2 | {2} | ∅ | ∅ |
| 3 | ∅ | {4} | ∅ |
| 4 | ∅ | {4} | ∅ |
| NFA State | DFA State | a | b |
|---|---|---|---|
| {0,1,3} | A | B | C |
| {2} | B | B | ∅ |
| {4} | C | ∅ | C |
| NFA State | DFA State | a | b |
|---|---|---|---|
| {0} | A | B | A |
| {0,1} | B | C | B |
| {0,1,2} | C | C | D |
| {0,2,3} | D | C | D |
| NFA State | DFA State | a | b |
|---|---|---|---|
| {0,1,2,3} | A | A | A |
| NFA State | DFA State | a | b |
|---|---|---|---|
| {0,1,2,3,7} | A | B | C |
| {1,2,3,4,6,7} | B | B | C |
| {1,2,3,5,6,7} | C | B | C |
| NFA State | DFA State | a | b |
|---|---|---|---|
| {0,1,2,3,4,5,8,9,10,11} | A | B | C |
| {1,2,3,4,5,6,8,9,10,11} | B | B | C |
| {1,2,3,4,5,7,8,9,10,11} | C | B | C |
| NFA State | DFA State | a | b |
|---|---|---|---|
| {0,1,2,3,4,6,7,9,10} | A | B | C |
| {1,2,3,4,5,6,7,9,10} | B | B | C |
| {1,2,3,4,6,7,8,9,10} | C | B | C |
| NFA State | DFA State | a | b |
|---|---|---|---|
| {0,1,2,4,7} | A | B | C |
| {1,2,3,4,6,7,8} | B | B | D |
| {1,2,4,5,6,7} | C | B | C |
| {1,2,4,5,6,7,9} | D | B | E |
| {1,2,4,5,6,7,10,11,12,14,17} | E | F | G |
| {1,2,3,4,6,7,8,11,12,13,14,16,17} | F | F | H |
| {1,2,4,5,6,7,11,12,13,15,16,17} | G | F | G |
| {1,2,4,5,6,7,9,11,12,14,15,16,17} | H | F | I |
| {1,2,4,5,6,7,10,11,12,14,15,16,17} | I | F | G |
| node n | nullable(n) | firstpos(n) |
|---|---|---|
| n = c_1 ? | true | firstpos(c_1) |
| n = c_1 + | nullable(c_1) | firstpos(c_1) |
| node n | followpos(n) |
|---|---|
| 1 | {1, 2, 3} |
| 2 | {1, 2, 3} |
| 3 | ∅ |
| extended grammar | not extended grammar |
|---|---|
| A -> X[Y]Z | A -> XZ | XYZ |
| A -> X{YZ} | A -> XB B -> YZB | ε |
| 非终结符号 | 输入符号 | ||
|---|---|---|---|
| 0 | 1 | $ | |
| S | S -> 0 A | ||
| A | A -> 0 A 1 | A -> 1 | |
| 非终结符号 | 输入符号 | |||
|---|---|---|---|---|
| + | * | a | $ | |
| S | S -> + S S | S -> * S S | S -> a | |
| 非终结符号 | 输入符号 | ||
|---|---|---|---|
| ( | ) | $ | |
| S | S -> A | S -> A | S -> A |
| A | A -> (S) S A A -> ε |
A -> ε | A -> ε |
| 非终结符号 | 输入符号 | |||||
|---|---|---|---|---|---|---|
| ( | ) | + | * | a | $ | |
| S | S -> TB | S -> TB | ||||
| B | B -> AB | B -> AB | B -> AB | B -> AB | B -> ε | |
| A | A -> TB | A -> +S | A -> \* | A -> TB | ||
| T | T -> (S) | T -> a | ||||
| 非终结符号 | 输入符号 | |||||||
|---|---|---|---|---|---|---|---|---|
| and | or | not | ( | ) | true | false | $ | |
| bexpr | bexpr -> bterm bexpr' | bexpr -> bterm bexpr' | bexpr -> bterm bexpr' | bexpr -> bterm bexpr' | ||||
| bexpr' | bexpr' -> or bterm bexpr' | bexpr' -> ε | bexpr' -> ε | |||||
| bterm | bterm -> bfactor bterm' | bterm -> bfactor bterm' | bterm -> bfactor bterm' | bterm -> bfactor bterm' | ||||
| bterm' | bterm' -> and bfactor bterm' | bterm' -> ε | bterm' -> ε | |||||
| bfactor | bfactor -> not bfactor | bfactor -> (bexpr) | bfactor -> true | bfactor -> false | ||||
| 非终结符号 | 输入符号 | |||
|---|---|---|---|---|
| + | * | a | $ | |
| S | S -> aB | |||
| A | A -> + | A -> * | ||
| B | B -> ε | B -> ε | B -> SAB | B -> ε |
S → AB | a
A → b
S, A, a, and
b are generating. B is not generating.S → a
A → b
A is not reachable from S, so
we can eliminate the second production to getS → a
S.S → AB
A → aAA | ε
B → bBB | ε
S → AB
we add the productions S → A | BA → aAA
we add the productions A → aA | aB → bBB
we add the productions B → bB | bS → AB | A | B
A → aAA | aA | a
B → bBB | bB | b
A → B
where both A and B are nonterminals.E → E + T | T
T → T * F | F
F → ( E ) | a
(E,E), (E,T), (E,F), (T,T), (T,F), (F,F).E → E + T | T * F | ( E ) | a
T → T * F | ( E ) | a
F → ( E ) | a
E → EA | TB | LC | a
A → PT
P → +
B → MF
M → *
L → (
C → ER
R → )
T → TB | LC | a
F → LC | a
Xij with nonterminals A
such that A ⇒*
aiai+1 ...
aj.
for i = 1 to n do
if A → ai is in P then
add A to Xii
fill in the table, row-by-row, from row 2 to row n
fill in the cells in each row from left-to-right
if (A → BC is in P) and for some i ≤ k < j
(B is in Xik) and (C is in Xk+1,j) then
add A to Xij
if S is in X1n then
output "yes"
else
output "no"
Xij iff there is a
production A → BC in P where B ⇒*
aiai+1 ... ak
and C ⇒*
ak+1ak+2 ... aj.Xij, we examine at most
n pairs of entries:
(Xii, Xi+1,j),
(Xi,i+1, Xi+2,j),
and so on until
(Xi,j-1, Xj,j).S → AB | CA
A → a
B → BC | AB
C → aB | b
S → ASB | ε
A → aAS | a
B → BbS | A | bb
C → aB | b
| 栈 | 输入 | 句柄 | 动作 |
|---|---|---|---|
| $ | 000111$ | 移入 | |
| $0 | 00111$ | 移入 | |
| $00 | 0111$ | 移入 | |
| $000 | 111$ | 移入 | |
| $0001 | 11$ | 01 | 规约:S -> 01 |
| $00S | 11$ | 移入 | |
| $00S1 | 1$ | 0S1 | 规约:S -> 0S1 |
| $0S | 1$ | 移入 | |
| $0S1 | $ | 0S1 | 规约:S -> 0S1 |
| $S | $ | 接受 |
| 栈 | 输入 | 句柄 | 动作 |
|---|---|---|---|
| $ | aaa*a++$ | 移入 | |
| $a | aa*a++$ | a | 规约: S -> a |
| $S | aa*a++$ | 移入 | |
| $Sa | a*a++$ | a | 规约: S -> a |
| $SS | a*a++$ | 移入 | |
| $SSa | *a++$ | a | 规约: S -> a |
| $SSS | *a++$ | 移入 | |
| $SSS* | a++$ | SS* | 规约: S -> SS* |
| $SS | a++$ | 移入 | |
| $SSa | ++$ | a | 规约: S -> a |
| $SSS | ++$ | 移入 | |
| $SSS+ | +$ | SS+ | 规约: S -> SS+ |
| $SS | +$ | 移入 | |
| $SS+ | $ | SS+ | 规约: S -> SS+ |
| $S | $ | 接受 |
| 状态 | ACTION | GOTO | |||||
|---|---|---|---|---|---|---|---|
| a | + | * | $ | S | A | B | |
| 0 | s2 | s1 | |||||
| 1 | acc | ||||||
| 2 | s4 | r3 | r3 | r3 | s3 | ||
| 3 | r1 | ||||||
| 4 | s4 | r3 | r3 | r3 | s5 | ||
| 5 | s7 | s8 | s6 | ||||
| 6 | s4 | r3 | r3 | r3 | s9 | ||
| 7 | r4 | r4 | |||||
| 8 | r5 | r5 | |||||
| 9 | r2 | r2 | r2 | ||||
| 栈 | 符号 | 输入 | 动作 | |
|---|---|---|---|---|
| 1) | 0 | aa*a+$ | 移入 | |
| 2) | 02 | a | a*a+$ | 移入 |
| 3) | 024 | aa | *a+$ | 根据 B -> ε 规约 |
| 4) | 0245 | aaB | *a+$ | 移入 |
| 5) | 02458 | aaB* | a+$ | 根据 A -> * 规约 |
| 6) | 02456 | aaBA | a+$ | 移入 |
| 7) | 024564 | aaBAa | +$ | 根据 B -> ε 规约 |
| 8) | 0245645 | aaBAaB | +$ | 移入 |
| 9) | 02456457 | aaBAaB+ | $ | 根据 A -> + 规约 |
| 9) | 02456456 | aaBAaBA | $ | 根据 B -> ε 规约 |
| 10) | 024564569 | aaBAaBAB | $ | 根据 B -> aBAB 规约 |
| 11) | 024569 | aaBAB | $ | 根据 B -> aBAB 规约 |
| 12) | 023 | aB | $ | 根据 S -> aB 规约 |
| 13) | 01 | S | $ | 接受 |
| 产生式 | 语法规则 | |
|---|---|---|
| 1) | L -> En | L.val = E.val |
| 2) | E -> TE' | E'.inh = T.val E.val = E'.syn |
| 3) | E' -> +TE_1' | E_1'.inh = E'.inh + T.val E'.syn = E_1'.syn |
| 4) | E' -> ε | E'.syn = E'.inh |
| 5) | T -> FT' | T'.inh = F.val T.val = T'.syn |
| 6) | T' -> *FT_1' | T_1'.inh = T'.inh * F.val T'.syn = T_1'.syn |
| 7) | T' -> ε | T'.syn = T'.inh |
| 8) | F -> (E) | F.val = E.val |
| 9) | F -> digit | F.val = digit.lexval |
| 产生式 | 语法规则 | |
|---|---|---|
| 1) | S -> L_1.L_2 |
L_1.isLeft = true L_2.isLeft = false S.val = L_1.val + L_2.val |
| 2) | S -> L |
L.isLeft = true S.val = L.val |
| 3) | L -> L_1B |
L_1.isLeft = L.isLeft L.len = L_1.len + 1 L.val = L.isLeft ? L_1.val * 2 + B.val : L_1.val + B.val * 2^(-L.len) |
| 4) | L -> B |
L.len = 1 L.val = L.isLeft ? B.val : B.val/2 |
| 5) | B -> 0 | B.val = 0 |
| 6) | B -> 1 | B.val = 1 |
| 产生式 | 语法规则 | |
|---|---|---|
| 1) | S -> L_1.L_2 | S.val = L_1.val + L_2.val/L_2.f |
| 2) | S -> L | S.val = L.val |
| 3) | L -> L_1B | L.val = L_1.val*2 + B.val L.f = L_1.f * 2 |
| 4) | L -> B | L.val = B.val L.f = 2 |
| 5) | B -> 0 | B.val = 0 |
| 6) | B -> 1 | B.val = 1 |
| 产生式 | 语法规则 | |
|---|---|---|
| 1) | E -> E_1 + T | E.type = E_1.type === float || T.type === float ? float : int |
| 2) | E -> T | E.type = T.type |
| 3) | T -> num.num | T.type = float |
| 4) | T -> num | T.type = int |
| 产生式 | 语法规则 | |
|---|---|---|
| 1) | L -> En | L.cleanExpr = E.wrapped ? E.cleanExpr : E.expr |
| 2) | E -> E_1 + T |
E.wrapped = false E.precedence = 0 E.expr = E_1.expr || "+" || T.expr E.cleanExpr = (E_1.wrapped ? E_1.cleanExpr : E_1.expr) || "+" || (T.wrapped ? T.cleanExpr : T.expr) |
| 3) | E -> T |
E.wrapped = T.wrapped E.precedence = T.precedence E.expr = T.expr E.cleanExpr = T.cleanExpr |
| 4) | T -> T_1 * F |
T.wrapped = false T.precedence = 1 T.expr = T_1.expr || "*" || F.expr T.cleanExpr = (T_1.wrapped && T_1.precedence >= 1 ? T_1.cleanExpr : T_1) || * || (F.wrapped && F.precedence >= 1 ? F.cleanExpr : F.expr) |
| 5) | T -> F |
T.wrapped = F.wrapped T.precedence = F.precedence T.expr = F.expr T.cleanExpr = F.cleanExpr |
| 6) | F -> (E) |
F.wrapped = true F.precedence = E.precedence F.expr = "(" || E.expr || ")" F.cleanExpr = E.expr |
| 7) | F -> digit |
F.wrapped = false F.precedence = 3 F.expr = digit F.cleanExpr = digit |
| 1 | id | a | |
| 2 | id | b | |
| 3 | + | 1 | 2 |
| 4 | + | 3 | 3 |
| 1 | id | a | |
| 2 | id | b | |
| 3 | + | 1 | 2 |
| 4 | + | 3 | 1 |
| 5 | + | 4 | 2 |
| 1 | id | a | |
| 2 | + | 1 | 1 |
| 3 | + | 2 | 1 |
| 4 | + | 3 | 1 |
| 5 | + | 3 | 4 |
| 6 | + | 2 | 5 |
| op | arg1 | arg2 | result | |
|---|---|---|---|---|
| 0 | + | b | c | t1 |
| 1 | minus | t1 | t2 | |
| 2 | + | a | t2 | t3 |
| op | arg1 | arg2 | |
|---|---|---|---|
| 0 | + | b | c |
| 1 | minus | (0) | |
| 2 | + | a | (1) |
| op | arg1 | arg2 | |
|---|---|---|---|
| 0 | + | b | c |
| 1 | minus | (0) | |
| 2 | + | a | (1) |
| instruction | |
|---|---|
| 0 | (0) |
| 1 | (1) |
| 2 | (2) |