Есть ли способ заставить JavaCC принять неоднозначную грамматику без LL (1)? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь создать анализатор 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;
        }

Я ожидал, что парсер будет работать, но не правильно. Не должно ли быть так? Если ожидается эта ошибка, есть ли способ заставить ее работать даже с этой неоднозначной грамматикой?

примечание: я пока не хочу использовать упреждающий просмотр, моя цель - использовать ее позже, когда я объясню, как это может решить проблему.

1 Ответ

2 голосов
/ 24 марта 2020

Теперь JavaCC не имеет проблем с этим. Он выдает предупреждения и код. java, который правильно отражает файл .jj. Проблема в том, что ваш Java компилятор не любит недоступный код.

См. Есть ли способ игнорировать ошибку "Недоступный оператор"?

Что вы можете сделать сделать это

void s() : 
{}
{
    "a" ( LOOKAHEAD({true})  // TODO fix the lookahead
          bc()
        | 
          bd() )
    <EOF>   
}
...