【问题标题】:Why Bison gives Conflict: 2 Shift Reduce error为什么 Bison 会给出冲突:2 班次减少错误
【发布时间】:2014-06-27 04:42:50
【问题描述】:

我正在尝试 YACC 语法部分,但它给了我,这有什么问题?我该如何解决?在 Bison/YACC 中有一些定义语法的规则吗?

C:\Users\Dilan\Documents\LexProgram\miniProject>bison -dy videostore.y
conflicts: 1 shift/reduce

我的 YACC 代码是:

%start VideoStore
%token title
%token type
%token name
%token days


%%

VideoStore  :   MOVIES CUSTOMERS
        |  CUSTOMERS MOVIES  
        |  MOVIES
        |  CUSTOMERS
        ;


MOVIES      :   MOVIES MOVIE
        |   MOVIE
        ;

MOVIE       :   title type RENTALS2
        ;

RENTALS2    :   RENTALS2 RENTAL2
        |   RENTAL2
        ;

RENTAL2     :   CUSTOMER1
        ;


CUSTOMER1   :   name days
        ;

CUSTOMERS   :   CUSTOMERS CUSTOMER
        |   CUSTOMER
        ;

CUSTOMER    :   name days RENTALS
        ;
RENTALS     :   RENTALS RENTAL
        |   RENTAL
        ;

RENTAL      :   MOVIE1
        ;

MOVIE1      :   title type
        ;

%%
int trace=0;

我的问题是 VideoStore.y:冲突:2 班次/减少 以及如何为此编写 LEX?

【问题讨论】:

  • 你有这个示例输入文件吗?基本上,警告意味着您的语言有歧义。它可能会也可能不会起作用。更大的问题是您没有使用关键字,并且您的词法分析器需要识别字符串是客户名称还是电影标题。建议:改为使用 XML。
  • 词法分析器需要什么关键字?和。我已经浏览了cis.uab.edu/softcom/GrammarInference/publications/scesm2005.pdf 这个研究表,我想试试这个语法,而不是所有的研究表。我正在学习这个
  • 词法分析器不需要关键字,解析器需要。词法分析器只能看到字符序列,因此任何文本都可能被解析为“字符串”(而不是标题或名称),这仍然会产生更多歧义。如答案中所述,您必须在文件中引入一些终端标记,例如围绕一组事物的分隔符或括号。

标签: compiler-construction bison context-free-grammar


【解决方案1】:

bison 使用-v 选项,它会为您提供一个显示所有状态以及任何冲突所在位置的.output 文件。在您的情况下,您在状态 16 和 20 中存在冲突:

state 16

    7 MOVIE: title type RENTALS2 .
    8 RENTALS2: RENTALS2 . RENTAL2

    name  shift, and go to state 15

    name      [reduce using rule 7 (MOVIE)]
    $default  reduce using rule 7 (MOVIE)

    RENTAL2    go to state 24
    CUSTOMER1  go to state 18

这告诉您问题在于解析器无法确定 MOVIE 规则的结束位置与单个前瞻标记 - MOVIE 以一个或多个 @987654326 的序列结束@ 规则,但由于 RENTAL2name 开头,MOVIE 之后的内容(例如 CUSTOMER 规则)也以 name 开头,因此无法判断是否应该尝试是否匹配更多RENTAL2s。

最常见的是,您可以通过在 RENTALS2 列表末尾使用某种分隔符来解决此问题,例如 ';'

【讨论】:

  • 亲爱的 Chris Dodd,你能解释一下吗,那我要如何编辑程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多