Я хотел бы создать грамматику LALR для разбора вложенных списков, но я всегда получаю конфликт сдвиг / уменьшение.
У меня есть list1, который представляет собой список элементов type1 и list2:
<list1> ::= <type1> | <type1> <list1> ;
<type1> ::= A | B | <list2> ;
И у меня есть список list2, представляющий собой список элементов type2:
<list2> ::= <type2> | <type2> <list2> ;
<type2> ::= X | Y ;
Эта грамматика выдает ошибку сдвига / уменьшения.Как я могу избежать этого?
Это конкретный Bigloo источник:
(lalr-grammar
(comment
new-line
text-chunk
white-space)
(input
(() '())
((node-list) node-list))
(node-list
((node) (cons node '()))
((node node-list) (cons node node-list)))
(node
((comment) (cons 'comment comment))
((new-line) (cons 'new-line new-line))
((text) (cons 'text text))
((white-space) (cons 'white-space white-space)))
(text
((text-chunk) (cons 'text text-chunk))
((text-chunk text) (cons 'text (string-append text-chunk text)))))
Терминалы: комментарий, новая строка, текстовый чанк и белыйпространство.Нетерминалы: input, node-list, node и text.
Bigloo жалуется на правило сокращения текста в text-chunk:
*** WARNING:bigloo:lalr-grammar
** Shift/Reduce conflict:
- shift to state 2
- reduce rule (text --> text-chunk)
on token `text-chunk'
Но я не думаю, что этопроблема БиглооЭто похоже на проблему грамматики.