Джисон: Уменьшить количество конфликтов там, где их на самом деле нет.

Я пытаюсь создать небольшой анализатор JavaScript, который также включает типизированные переменные для небольшого проекта.

К счастью, jison уже предоставляет файл jscore.js, который я только что настроил под свои нужды. После добавления типов я столкнулся с конфликтом сокращения. Я минимизировал проблему до этого минимума JISON:

Джисон:

%start SourceElements
%%

// This is up to become more complex soon
Type
    : VAR
    | IDENT
    ;

// Can be a list of statements
SourceElements
    : Statement
    | SourceElements Statement
    ;

// Either be a declaration or an expression
Statement
    : VariableStatement
    | ExprStatement
    ;

// Parses something like: MyType hello;
VariableStatement
    : Type IDENT ";"
    ;

// Parases something like hello;
ExprStatement
    : PrimaryExprNoBrace ";"
    ;

// Parses something like hello;
PrimaryExprNoBrace
    : IDENT
    ;

На самом деле этот скрипт ничего не делает, кроме разбора двух операторов:

Утверждение переменной

IDENT IDENT ";"

Отчет об опыте

IDENT ";"

Поскольку это чрезвычайно минимизированный сценарий JISON, я не могу просто заменить «Тип» на «ИДЕНТИФИКАТОР» (что, кстати, сработало).

Генерация парсера вызывает следующие конфликты:

Conflict in grammar: multiple actions possible when lookahead token is IDENT in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT
Conflict in grammar: multiple actions possible when lookahead token is ; in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT

States with conflicts:
State 8
  Type -> IDENT . #lookaheads= IDENT ;
  PrimaryExprNoBrace -> IDENT . #lookaheads= IDENT ;

Есть ли какой-нибудь трюк, чтобы исправить этот конфликт?

Заранее благодарю! ~ Бенджамин


person Benjamin Schulte    schedule 19.10.2013    source источник
comment
Я должен что-то упустить здесь. У меня нет конфликтов с GNU Bison 2.4.1.   -  person Thomas Padron-McCarthy    schedule 20.10.2013
comment
Спасибо за попытку. Может быть, это проблема с Джисоном, которым я действительно пользуюсь.   -  person Benjamin Schulte    schedule 20.10.2013
comment
@BenjaminSchulte, ты решил эту проблему? Я борюсь с подобной проблемой и не могу найти никакого ответа...   -  person Vees    schedule 17.12.2015


Ответы (1)


Это похоже на ошибку Jison для меня. Он жалуется на двусмысленность в случаях этих двух последовательностей токенов:

  1. ИДЕНТ. ИДЕНТ.
  2. ИДЕНТ. ";"

Рассматриваемое состояние достигается после сдвига первого токена IDENT. Jison замечает, что ему нужно уменьшить этот токен, и что (он утверждает) он не знает, следует ли уменьшать до Type или до PrimaryExpressionNoBrace.

Но Jison должен иметь возможность различать на основе следующего токена: если это второй IDENT, то только преобразование в Type может привести к правильному синтаксическому анализу, тогда как если это «;» тогда только сокращение до PrimaryExpressionNoBrace может привести к правильному синтаксическому анализу.

Вы уверены, что данный вывод соответствует данной грамматике? Можно было бы либо добавить правила, либо изменить данные, чтобы создать двусмысленность, подобную описанной. Это кажется таким простым делом, что я удивлен, что Джисон ошибается. Однако, если это действительно так, вам следует подумать о подаче отчета об ошибке.

person John Bollinger    schedule 28.10.2013
comment
Я считаю, что это ошибка 205, о которой сообщалось в январе 2014 г. (от кого-то другого). - person rici; 17.12.2015