Shift уменьшить конфликты
Ниже грамматики я делаю.
- S '-> sqf
- sqf -> объявления
- декларации -> декларация
- декларации -> декларации декларации
- декларация -> отношение
- декларация
- отношение -> тело головы
- отношение -> отношения
- norelation -> reldata
- norelation -> relatts reldata
- head -> атрибуты relname
- тело -> reldata
- тело -> пусто
- relname -> ИДЕНТИФИКАТОР RELKW
- атрибуты -> релатс
- атрибуты -> пусто
- relatts -> attname
- relatts -> attname relatts
- reldata -> кортежи DATAKW
- reldata -> DATAKW
- кортежи -> кортежи
- кортежи -> кортежи кортежей
- attname -> ИДЕНТИФИКАТОР ATTKW
- кортеж -> ЗНАЧЕНИЕ
- пусто ->
Проблема в том, что грамматика неоднозначна, потому что для некоторых правил существуют конфликты сдвига / уменьшения. в частности
по правилам ниже для DATAKW у нас есть сдвиг / уменьшить конфликт
- отношение -> тело головы
- тело -> reldata
- тело -> пусто
- reldata -> кортежи DATAKW
- reldata -> DATAKW
- * пусто -> *
по правилам ниже для DATAKW у нас есть сдвиг / уменьшить конфликт
- отношение -> отношения
- norelation -> relatts reldata
- reldata -> кортежи DATAKW
- reldata -> DATAKW
по приведенным ниже правилам для ATTKW у нас есть сдвиг / уменьшение конфликта
- head -> атрибуты relname
- атрибуты -> релатс
- атрибуты -> пусто
- relatts -> attname
- relatts -> attname relatts
- * пусто -> *
- attname -> ИДЕНТИФИКАТОР ATTKW
по приведенным ниже правилам для ATTKW у нас есть сдвиг / уменьшение конфликта
- relatts -> attname
- relatts -> attname relatts
- relatts -> attname
- relatts -> attname relatts
- attname -> ИДЕНТИФИКАТОР ATTKW
Может ли кто-нибудь помочь мне решить эти конфликты, пожалуйста.
1 ответ
Проблема в том, что грамматика не может определить, где declaration
заканчивается и начинается следующий
Простой пример этой общей проблемы: norelation
может быть просто relatts
который может быть списком attname
s. Так что если у вас есть два подряд norelation
, это может быть две последовательности attname
s. Как вы можете отличить две последовательные последовательности от одной более длинной последовательности? Или три короче? И т.п.
Есть много других случаев той же проблемы.
Если вы неправильно расшифровали язык, это проблема языкового дизайна, а точки с запятой - это общее решение.