在我的语法中获得转移/减少错误

时间:2014-12-29 13:32:14

标签: c compiler-construction yacc lex

这是我的编程语言的语法部分。我在编译时遇到了转换/减少冲突。

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中得到转移/减少冲突。 你能建议我修改一下吗?

2 个答案:

答案 0 :(得分:3)

您的key_spec规则格式不正确。确实,你有一个无限的递归 您应该将其更改为

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

编辑:删除%empty野牛分机。

答案 1 :(得分:1)

@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之后减少。