这是我的令牌表:
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 会删除警告。任何帮助理解将不胜感激。