【问题标题】:getting shift/reduce errors in my grammar在我的语法中出现移位/减少错误
【发布时间】:2014-12-29 13:32:14
【问题描述】:

这是我的编程语言的语法部分。我在编译时遇到了 shift/reduce 冲突。

Rule 1:    encryption_spec: key_spec 

Rule 2:   key_spec:
    key_spec key_spec_content
    | key_spec_content
    ;

Rule 3:    key_spec_content: TOK_PROTECT key_keyowner 
    |TOK_PROTECT key_keyname
    |TOK_PROTECT key_keymethod
    |TOK_PROTECT key_pub_key
    |TOK_COMMA key_keyowner 
    |TOK_COMMA key_keyname
    |TOK_COMMA key_keymethod
    |TOK_COMMA key_pub_key
    |encoding
    ;

我在规则 1 中遇到了 shift/reduce 冲突。 你能建议我修改一下吗?

【问题讨论】:

  • 查看来自yacc -vy.output 文件以了解实际冲突是什么——您需要查看冲突处于什么状态以及解析器如何进入该状态以解决它.
  • 从y.output中可以清楚地看出冲突的原因是:找到至少一个语句后,语法无法决定是继续查找还是按照规则1声明encryption_spec块出现根据规则 3
  • 那么还有一些其他的规则可以遵循encryption_spec,在你上面的sn-p中没有显示,那就是冲突的根源。
  • FWIW,SHIFT/REDUCE 不一定是您的语法错误。您可以在 YACC 中编程,这只是一个模棱两可的问题。这并不是说您的语法没有错误,但我不知道您要做什么。 REDUCE/REDUCE 是您必须注意的。

标签: c compiler-construction yacc lex


【解决方案1】:

您的 key_spec 规则格式错误。事实上,你有一个无限递归。
您应该将其更改为类似

key_spec: /* Empty. */
    | key_spec key_spec_content
;

编辑:删除 %empty bison 扩展。

【讨论】:

  • 请注意,%empty 是一个野牛扩展,用于使 epsilon 规则更加可见。对于普通的 yacc,您需要一个空规则(:| 之间除了空格之外没有任何内容)
  • 那是一个错字。我知道这是一个无限递归。我仍然在规则 1 中得到一个移位减少/冲突。语法的任何替代方法?
  • 第一:你能编辑你原来的帖子来修正错字吗?第二:没有看到你的其他非终端规则,我帮不了你。编写此程序并将key_*encoding 作为终端不会警告任何冲突。
  • @LéoErcolanelli 那是我的错!你能就这个问题提出一些建议吗?我认为冲突的原因是:在找到规则3的至少一个语句后,语法无法决定是否扩展或声明规则1的encryption_spec块发生。
  • @AnkurGautam 问题不在于您给我们的 sn-p。我可以测试这个要点以重现您的减班冲突,但它没有给我任何东西。 gist.github.com/ercolanelli-leo/88a7dca033cee9264912 随意修改或评论添加缺失的规则!
【解决方案2】:

@Leo 的规则是不正确的,因为它允许 key_spec_content 出现零次,而原始要求至少出现一次。以下应该这样做:

key_spec:
  key_spec key_spec_content
  | key_spec_content
;

但是,这个规则有一个不必要的递归。以下应该更好:

key_spec:
  key_spec_content key_spec
  | key_spec_content
;

这允许在看到每个 key_spec_content 后减少。

【讨论】:

  • 我同意空规则。但是,您在左右递归方面是错误的。实际上,左递归确实在每个 key_spec_content 处减少,而不是右递归。 gnu.org/software/bison/manual/html_node/Recursion.html
  • 原版需要无限数量的key_spec_content,并且不允许任何有限数量。因此,您需要更改它以允许有限输入,并且允许 0 或更多和 1 或更多之间的选择似乎是任意的。
  • 那是一个错字。我知道这是一个无限递归。我仍然在规则 1 中得到一个移位减少/冲突。语法的任何替代方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多