如何解决具有相同令牌的多项选择情况下的选择冲突
How to resolve conflict in choice in multiple choices case that have the same token
我正在尝试为某些特定格式的消息编写编译器。我现在的问题是,因为我正在构建不同格式的特定消息,所以描述如下
< WORD : ([LETTER]){2,5}>
< ANOTHER_WORD : (<LETTER>|<DIGIT>){1,5}>
< SPECIAL_WORLD_EN : "START">
< SPECIAL_WORLD_FR : "COMMENCER">
< SPECIAL_END_WORLD_EN : "END">
< SPECIAL_END_WORLD_FR : "FIN">
< LEFT_BRACKET : "[">
< RIGHT_BRACKET : "]">
void grammar():
{
}
{
LOOKAHEAD(2)
<LEFT_BRACKET><SPECIAL_WORLD_EN>< WORD ><RIGHT_PAREN>
| <LEFT_BRACKET><SPECIAL_WORLD_FR>< WORD >< ANOTHER_WORD ><RIGHT_BRACKET>
| <LEFT_BRACKET><SPECIAL_END_WORLD_EN>(< WORD >)?<RIGHT_BRACKET>
| <LEFT_BRACKET><SPECIAL_END_WORLD_FR>(< WORD >)+<RIGHT_BRACKET>
}
因此 LOOKAHEAD(2) 解决了前两个选择的冲突。
我怎样才能解决其他选择的冲突
(在真正的语法中我有4个以上的选择)
更新
我设法通过在每个选择中使用 LOOKAHEAD(2) 来删除选择冲突警告
void grammar():
{
}
{
LOOKAHEAD(2)
<LEFT_BRACKET><SPECIAL_WORLD_EN>< WORD ><RIGHT_PAREN>
| LOOKAHEAD(2) <LEFT_BRACKET><SPECIAL_WORLD_FR>< WORD >< ANOTHER_WORD ><RIGHT_BRACKET>
| LOOKAHEAD(2) <LEFT_BRACKET><SPECIAL_END_WORLD_EN>(< WORD >)?<RIGHT_BRACKET>
| LOOKAHEAD(2) <LEFT_BRACKET><SPECIAL_END_WORLD_FR>(< WORD >)+<RIGHT_BRACKET>
}
我不确定这是最好的解决方案,还有其他 better/correct 方法可以解决吗?
左因子:
void grammar():
{ }
{
<LEFT_BRACKET>
( <SPECIAL_WORLD_EN>< WORD ><RIGHT_PAREN>
| <SPECIAL_WORLD_FR>< WORD >< ANOTHER_WORD ><RIGHT_BRACKET>
| <SPECIAL_END_WORLD_EN>(< WORD >)?<RIGHT_BRACKET>
| <SPECIAL_END_WORLD_FR>(< WORD >)+<RIGHT_BRACKET> )
}
我正在尝试为某些特定格式的消息编写编译器。我现在的问题是,因为我正在构建不同格式的特定消息,所以描述如下
< WORD : ([LETTER]){2,5}>
< ANOTHER_WORD : (<LETTER>|<DIGIT>){1,5}>
< SPECIAL_WORLD_EN : "START">
< SPECIAL_WORLD_FR : "COMMENCER">
< SPECIAL_END_WORLD_EN : "END">
< SPECIAL_END_WORLD_FR : "FIN">
< LEFT_BRACKET : "[">
< RIGHT_BRACKET : "]">
void grammar():
{
}
{
LOOKAHEAD(2)
<LEFT_BRACKET><SPECIAL_WORLD_EN>< WORD ><RIGHT_PAREN>
| <LEFT_BRACKET><SPECIAL_WORLD_FR>< WORD >< ANOTHER_WORD ><RIGHT_BRACKET>
| <LEFT_BRACKET><SPECIAL_END_WORLD_EN>(< WORD >)?<RIGHT_BRACKET>
| <LEFT_BRACKET><SPECIAL_END_WORLD_FR>(< WORD >)+<RIGHT_BRACKET>
}
因此 LOOKAHEAD(2) 解决了前两个选择的冲突。 我怎样才能解决其他选择的冲突 (在真正的语法中我有4个以上的选择)
更新 我设法通过在每个选择中使用 LOOKAHEAD(2) 来删除选择冲突警告
void grammar():
{
}
{
LOOKAHEAD(2)
<LEFT_BRACKET><SPECIAL_WORLD_EN>< WORD ><RIGHT_PAREN>
| LOOKAHEAD(2) <LEFT_BRACKET><SPECIAL_WORLD_FR>< WORD >< ANOTHER_WORD ><RIGHT_BRACKET>
| LOOKAHEAD(2) <LEFT_BRACKET><SPECIAL_END_WORLD_EN>(< WORD >)?<RIGHT_BRACKET>
| LOOKAHEAD(2) <LEFT_BRACKET><SPECIAL_END_WORLD_FR>(< WORD >)+<RIGHT_BRACKET>
}
我不确定这是最好的解决方案,还有其他 better/correct 方法可以解决吗?
左因子:
void grammar():
{ }
{
<LEFT_BRACKET>
( <SPECIAL_WORLD_EN>< WORD ><RIGHT_PAREN>
| <SPECIAL_WORLD_FR>< WORD >< ANOTHER_WORD ><RIGHT_BRACKET>
| <SPECIAL_END_WORLD_EN>(< WORD >)?<RIGHT_BRACKET>
| <SPECIAL_END_WORLD_FR>(< WORD >)+<RIGHT_BRACKET> )
}