Tiếp nối khái niệm CLOSURE, phép toán GOTO dùng để tính trạng thái kế tiếp của automaton LR(0) khi automaton đang ở tập mục I (đã được đóng — closed) và đọc vào một ký hiệu văn phạm X (có thể là terminal hoặc non-terminal):
GOTO(I,X)=CLOSURE({[A→αX.β]∣[A→α.Xβ]∈I})
Nói cách khác: lấy tất cả mục trong I có dấu chấm nằm ngay trước ký hiệu X, dịch chuyển dấu chấm qua phải X để tạo thành tập lõi (core), rồi tính CLOSURE của tập lõi đó theo đúng định nghĩa CLOSURE (xem lại: non-terminal là ký hiệu xuất hiện ở LHS của ít nhất 1 luật sinh trong văn phạm).
Nếu tập lõi rỗng (không có mục nào trong I có dấu chấm ngay trước X), quy ước GOTO(I,X) không tồn tại.
Cho văn phạm, tập mục I (đã đóng) và ký hiệu X, hãy tính GOTO(I,X).
Ví dụ: văn phạm E -> E + T(1), E -> T(2), T -> id(3); I={(1,0),(2,0),(3,0)} (tức CLOSURE của [E→.E+T]). Với X=T: các mục có dấu chấm trước T là (1,0)? không — (1,0) là E→.E+T, dấu chấm đứng trước E chứ không phải T. Mục (2,0): E→.T, dấu chấm trước T → dịch thành (2,1). Core ={(2,1)}, CLOSURE không mở rộng thêm gì (dấu chấm ở cuối). Vậy GOTO(I,T)={(2,1)}.
A -> X1 X2 ... Xm (nếu rỗng: A -> ε).i p.Nếu tập lõi rỗng: in đúng một dòng EMPTY.
Ngược lại: in dòng đầu là số lượng mục của GOTO(I,X), sau đó mỗi dòng một mục i p, sắp xếp tăng dần theo (i,p) như ở bài CLOSURE.
Ví dụ:
Đầu vào:
6
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
6
1 0
2 0
3 0
4 0
5 0
6 0
E
Đầu ra:
1
1 1
Đầu vào:
6
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
6
1 0
2 0
3 0
4 0
5 0
6 0
T
Đầu ra:
2
2 1
3 1
Đang tải editor...