2012-05-04 5 views
3

У меня есть файл грамматики - https://github.com/itrelease/fubar-script/blob/jsast/src/grammar.js, но я получаю conflicts, и я действительно не знаю, как это решить. Если бы кто-нибудь мог мне объяснить, это было бы полезно.Как избежать конфликтов в грамматике

Эти правила производят conflicts:

ParamVar: [ 
    ['Identifier', '$$ = $Identifier;'], 
    ['THIS', '$$ = new yy.ThisExpression();'] 
], 

PrimaryExpression: [ 
    ['THIS', '$$ = new yy.ThisExpression();'], 
    ['Literal', '$$ = $Literal;'], 
    ['ArrayLiteral', '$$ = $ArrayLiteral;'], 
    ['Identifier', '$$ = $Identifier;'], 
    ['ObjectLiteral', '$$ = $ObjectLiteral;'], 
    ['(Expression)', '$$ = $Expression;'] 
], 
+3

Пожалуйста, разместите необходимые части своей грамматики и ошибки, здесь, на SO. –

+0

Добавлен вопрос о правилах, вызывающих конфликты. –

+0

Антон, это поможет другим людям помочь вам, если вы предоставите шаги, которые вы предпринимаете для воспроизведения ошибок. –

ответ

2

Ваша текущая грамматика не имеет PrimaryExpressionNoBrace, но я полагаю, что проблема возникла с this старше версии грамматики.

конфликт вызван этой продукции:

MemberExpression: [ 
     ['PrimaryExpression', '$$ = $PrimaryExpression;'], 
     ['ArrowFunctionExpression', '$$ = $ArrowFunctionExpression'], 
     ... 

где

  • PrimaryExpression происходит в PrimaryExpressionNoBrace, который имеет '(Expression)'

  • Expression снова черпает в PrimaryExpressionNoBrace, который имеет IDENTIFIER или THIS альтернативы

  • ArrowFunctionExpression имеет '(FormalParameterList) => Block'

  • FormalParameterList имеет IDENTIFIER или THIS альтернативы тоже.

Таким образом, ввод левой скобки, с последующим IDENTIFIER или THIS уводит нас в LR-состояние, которое не может решить между сведением к PrimaryExpressionNoBrace или FormalParameterList, т.е. имеет свертку-свертка конфликтов на общих правовых последователях (например, правая скобка). Здесь нет единого вида токенов, и больше нет поддержки.

+0

Не эта страница https://github.com/zaach/jison/wiki/Deviations-From-Flex-Bison объясняет, что мы можем использовать lookahead? – TrexXx

+0

@TrexXx, речь идет о lexer lookahead, с точки зрения символов. Когда я сказал выше, это был уровень анализатора, с точки зрения токенов. – Gunther

+0

Хорошо, так что невозможно использовать анализ синтаксического анализатора с помощью Jison? Есть ли способ анонимных конфликтов в грамматике без использования lookahead? – TrexXx