Я пытаюсь создать анализатор didacti c в JavaCC, чтобы объяснить использование lookahead для моей домашней работы. Я думал о создании неоднозначной грамматики для porpose, чтобы показать поведение синтаксического анализатора в такой ситуации. Моя грамматика ниже:
void s() :
{}
{
"a" ( bc() | bd() ) <EOF>
}
void bc() :
{}
{
"b" "c"
}
void bd() :
{}
{
"b" "d"
}
Чтение JavaCC Обучающих программ о lookahead Я понял, что при создании парсера будет отображаться предупреждение об использовании lookahead ( Хорошо) и если игнорируется, парсер все равно будет работать, но всегда выбирая первый вариант. Я предположил последнюю часть, потому что учебник говорит: «Сгенерированный парсер все еще будет работать с использованием алгоритма предпросмотра по умолчанию, но он может не делать того, что вы ожидаете от него».
Однако, когда я пытаюсь создать парсер, отображается ошибка:
$ javac *.java
ExampleABCD.java:18: error: unreachable statement
}{
^
1 error
И причина:
case 6:{
bc();
break;
}{ //Here
bd();
break;
}
Я ожидал, что парсер будет работать, но не правильно. Не должно ли быть так? Если ожидается эта ошибка, есть ли способ заставить ее работать даже с этой неоднозначной грамматикой?
примечание: я пока не хочу использовать упреждающий просмотр, моя цель - использовать ее позже, когда я объясню, как это может решить проблему.