Compiler construction 具有相同标记的多项选择中如何解决选择冲突

Compiler construction 具有相同标记的多项选择中如何解决选择冲突,compiler-construction,lexer,javacc,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 : "E

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

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

<另一个词:(|){1,5}>




<左括号:“[”>
<右括号:“]>
无效语法():
{
}
{ 
前瞻(2)

|<另一个词>
|()?
|()+
}
因此,前瞻(2)解决了前两个选择的冲突。 我如何解决其他选择的冲突 (在真正的语法中,我有4个以上的选择)

更新 我通过在每个选项中使用前瞻(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>
}
void grammar():
{
}
{ 
前瞻(2)

|向前看(2)<另一个单词>
|前瞻(2)()?
|前瞻(2)()+
}
我不确定这是否是最好的解决方案,是否有其他更好/正确的解决方法?

左因素:

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> )
 }
void grammar():
{ }
{ 
(
|<另一个词>
|()?
|()+)
}
左侧系数:

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> )
 }
void grammar():
{ }
{ 
(
|<另一个词>
|()?
|()+)
}

你还没有解决你的词汇问题,比如说,它已经解决了,但是仍然有一些像这样的问题。在
WORD
的制作中,
[字母]
应该是
吗?你有两种问题。您有解析问题。解决办法如下。由于正则表达式生成的顺序,还存在词法问题。这个问题的答案是在回答你先前的问题时给出的。除非修复词法语法,否则即使语法正确,解析语法也无法工作。阅读常见问题解答,这里有详细的解释。我几乎有数百个代币,它们的构造都是特定的。这使得订购它们变得很困难。如果我改变词法状态,这个歧义可以被修复吗?(为每个选项定义自定义状态)您仍然没有修复在中描述的词法问题。例如,它已修复,但仍有一些类似于此的问题。在
WORD
的产品中,
[LETTER]
应该是
吗?您有两种问题。您有解析问题。解决办法如下。由于正则表达式生成的顺序,还存在词法问题。这个问题的答案是在回答你先前的问题时给出的。除非修复词法语法,否则即使语法正确,解析语法也无法工作。阅读常见问题解答,这里有详细的解释。我几乎有数百个代币,它们的构造都是特定的。这使得订购它们变得很困难。如果我改变词法状态,这个歧义可以被修复吗?(为每个选项定义自定义状态)