如何在具有相同令牌的多个选择案例中解决选择中的冲突

时间:2015-08-17 14:44:45

标签: compiler-construction lexer javacc

我试图为某些特定格式的消息编写编译器。我现在的问题是,我正在构建不同格式的特定消息,如下所述

< 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>
}

我不确定它是最好的解决方案,还有其他更好/正确的解决方法吗?

1 个答案:

答案 0 :(得分:0)

左边因素:

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> )
 }