Вот мой маркер таблицы:Неуверенный, почему этот LOOKAHEAD необходим в этих контекстах
TOKEN :
{
< A : "A" >
| < B : "B" >
| < C : "C" >
}
У меня есть этот код, который содержит 2 выбора конфликтов.
void Start() : {} {
< A> [ Bs() ] "-" < A>
}
void Bs() : {} {
("-" < B>)+
}
Для того, чтобы удалить конфликты выбор предупреждения, мне нужно добавить 2 LOOKAHEAD заявления, как так ...
void Start() : {} {
< A> [ LOOKAHEAD(2) Bs() ] "-" < A>
}
void Bs() : {} {
(LOOKAHEAD(1) "-" < B>)+
}
Я понимаю, почему первый LOOKAHEAD (2) нужен, но у меня нет идея, почему нужен второй LOOKAHEAD (1). Может кто-нибудь объяснить?
Аналогично для этого примера ...
void Start() :{} {
one()
|
two()
|
three()
|
four()
}
void one() : {} {
[ <B> ] (<A>)* <C>
}
void two() : {} {
<B> <A> < A> <B>
}
void three() : {} {
<B> <B> <A> [ <B> ] <A>
}
void four() : {} {
<A> [ <B><C> ] two()
}
Для того, чтобы удалить конфликты выбора, мне нужно добавить LOOKAHEADS как так ...
void Start() :{} {
LOOKAHEAD(1) one()
|
LOOKAHEAD(1) two()
|
three()
|
four()
}
void one() : {} {
[ <B> ] (<A>)* <C>
}
void two() : {} {
<B> <A> < A> <B>
}
void three() : {} {
<B> <B> <A> [ <B> ] <A>
}
void four() : {} {
<A> [ LOOKAHEAD(1) <B><C> ] two()
}
Я понятия не имею, почему эти LOOKAHEADS удалите предупреждения. Любое понимание помощи будет оценено по достоинству.