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