c - Yacc / Flex中的Shift / Reduce冲突

我在yacc有这个语法:

%{
    #include <stdio.h>
%}

%token texto SEP ERRO word

%start Ini

%%

Ini: Directivas SEP SEP Conceitos '$'
            { printf("Terminou bem...\n"); return 0; };

Directivas: Directiva
          | Directivas SEP Directiva
          ;

Conceitos: Conceito
         | Conceitos SEP SEP Conceito
         ;

Conceito: word SEP Atributos;

Atributos: Atributo
         | Atributos SEP Atributo
         ;

Directiva: texto;
Atributo: '-' texto;

%%

int main(){
    yyparse();
}

int yyerror(char *s){
    fprintf(stderr, "%s\n", s);
}

在flex中:
%{
    #include "y.tab.h"
%}

%%

[a-zA-Z]+           return word;

[a-zA-Z ]+          return texto;

\-                  return '-';

\n                  return SEP;

[ \t]               ;

.                   return ERRO;

<<EOF>>             return '$';

我想做一个有效的解析,比如:
text line
text line
text line

word
-text line
-text line
-text line

word
-text line

其中第一行是“Directivas”,然后是一个空行,然后是“Conceitos”,其中一个Conceito是一个单词,后面跟着几个文本行,开头是“-”。那些自负被一个空行隔开
但它发现了一个转移/减少冲突。。我是新来的,不知道为什么
对不起我的英语
谢谢你

最佳答案

使用yacc的(或bison的)-v选项可以获得生成的解析器的完整列表以及y.output文件中的语法冲突。当你用你的语法做这些的时候,你会得到一些东西,比如(从野牛那里):

State 16 conflicts: 1 shift/reduce
        :
state 16

    6 Conceito: word SEP Atributos .
    8 Atributos: Atributos . SEP Atributo

    SEP  shift, and go to state 20

    SEP       [reduce using rule 6 (Conceito)]
    $default  reduce using rule 6 (Conceito)

这将准确地告诉您冲突在哪里——在减少Attributos并查看SEP向前看之后,解析器不知道是否应该将SEP移动到它后面的另一个Atributo中,或者减少Conceito,只有在SEP后面有另一个SEP时才有效(需要两个令牌向前看)。
避免这种情况的一种方法是让lexer作为一个令牌返回多个SEPs(空行):
\n      return SEP;
\n\n    return SEP_SEP;

您可能希望在空白行上允许空白或多于单个空白行,而不是:
\n([ \t]*\n)+  return SEP_SEP;

本文翻译自 https://stackoverflow.com/questions/16703338/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c yacc flex-lexer lr


相关文章:

c - 野牛中缀计算器始终评估为0

java - GNUmakefile无法编译野牛和Flex程序

c - 写入系统调用何时返回?

c - yylval在lex和yacc中的作用

android - Android上的词法和语法分析器?

c++ - Flex ++的多个词法分析器

c - SIGSEGV发送两次-处理后使程序崩溃

c - C-获取指向字符串的指针地址

c - 使用双指针切换变量的值

c - 字符串输入到flex lexer