Shift уменьшить конфликты

Ниже грамматики я делаю.

  1. S '-> sqf
  2. sqf -> объявления
  3. декларации -> декларация
  4. декларации -> декларации декларации
  5. декларация -> отношение
  6. декларация
  7. отношение -> тело головы
  8. отношение -> отношения
  9. norelation -> reldata
  10. norelation -> relatts reldata
  11. head -> атрибуты relname
  12. тело -> reldata
  13. тело -> пусто
  14. relname -> ИДЕНТИФИКАТОР RELKW
  15. атрибуты -> релатс
  16. атрибуты -> пусто
  17. relatts -> attname
  18. relatts -> attname relatts
  19. reldata -> кортежи DATAKW
  20. reldata -> DATAKW
  21. кортежи -> кортежи
  22. кортежи -> кортежи кортежей
  23. attname -> ИДЕНТИФИКАТОР ATTKW
  24. кортеж -> ЗНАЧЕНИЕ
  25. пусто ->

Проблема в том, что грамматика неоднозначна, потому что для некоторых правил существуют конфликты сдвига / уменьшения. в частности

по правилам ниже для 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 который может быть списком attnames. Так что если у вас есть два подряд norelation, это может быть две последовательности attnames. Как вы можете отличить две последовательные последовательности от одной более длинной последовательности? Или три короче? И т.п.

Есть много других случаев той же проблемы.

Если вы неправильно расшифровали язык, это проблема языкового дизайна, а точки с запятой - это общее решение.

Другие вопросы по тегам