转移减少冲突

时间:2018-03-28 12:50:17

标签: parsing compiler-construction conflict shift-reduce

在我的语法之下。

  1. S' - >平方英尺
  2. sqf - >声明
  3. 声明 - >声明
  4. 声明 - >声明声明
  5. 声明 - >关系
  6. 声明 - > norelation
  7. relation - >头部身体
  8. norelation - > relatts
  9. norelation - > reldata
  10. norelation - >关系reldata
  11. head - > relname属性
  12. body - > reldata
  13. body - >空
  14. relname - > RELKW IDENTIFIER
  15. 属性 - > relatts
  16. 属性 - >空
  17. 相关信息 - > attname
  18. 相关信息 - > attname relatts
  19. reldata - > DATAKW元组
  20. reldata - > DATAKW
  21. 元组 - >元组
  22. 元组 - >元组元组
  23. attname - > ATTKW IDENTIFIER
  24. 元组 - > VALUE
  25. 空 - >
  26. 问题是语法含糊不清,因为有些规则存在转移/减少冲突。特别是

    根据DATAKW的以下规则,我们有转移/减少冲突

    • relation - >头部身体
    • body - > reldata
    • body - >空
    • reldata - > DATAKW元组
    • reldata - > DATAKW
    • * empty - > *

    根据DATAKW的以下规则,我们有转移/减少冲突

    • norelation - > relatts
    • norelation - >关系reldata
    • reldata - > DATAKW元组
    • reldata - > DATAKW

    根据ATTKW的以下规则,我们有转移/减少冲突

    • head - > relname属性
    • 属性 - > relatts
    • 属性 - >空
    • 相关信息 - > attname
    • 相关信息 - > attname relatts
    • * empty - > *
    • attname - > ATTKW IDENTIFIER

    根据ATTKW的以下规则,我们有转移/减少冲突

    • 相关信息 - > attname
    • 相关信息 - > attname relatts
    • 相关信息 - > attname
    • 相关信息 - > attname relatts
    • attname - > ATTKW IDENTIFIER

    请有人帮我解决这些冲突。

1 个答案:

答案 0 :(得分:0)

问题在于语法无法确定一个declaration结束而下一个结束的位置。

此常见问题的一个简单实例:norelation可以只是relatts,可以是attname的列表。因此,如果您有两个连续的norelation,则可能是两个attname s序列。如何区分两个连续序列和一个较长的序列?还是三个较短的?等

同一问题还有很多其他情况。

除非您错误地转录了语言,否则这是语言设计的问题,而分号是常见的解决方案。