删除shift / reduce警告

时间:2014-03-04 07:39:11

标签: bison yacc

我想用array name解析@后跟任意数量的单词和simple variable不再@后跟任意数量的单词:

数组名称示例:@people

简单变量名称:person

我需要解析的示例文件:

@people name1 name2
person name3 name4

我制定了一条规则:

list of record :
line list_of_record
{}
|
line
{};

line
:
AT_SYMBOL string string_list
{}
|
string string_list
{}
;

string_list:
string string_list
{}
|
string
{}
;
//here string is any string

但是我收到shift/reduce警告。有人可以提出某种方法,以便我可以删除这些警告。

1 个答案:

答案 0 :(得分:1)

没有办法告诉line以哪种语法结束。 任何 string可以是string_list中的一个项目,也可以是新line的开头。

因此,您需要决定如何标记line的结尾。如果它是一个新的行字符,看起来很直观,那么你的词法分析器必须将换行标记传递给语法。

顺便说一句,通常最好在自下而上的语法中使用左递归。所以我建议这样的事情:

 lines: /* empty */
      | lines line NEWLINE
      ;

 line : /* empty, to allow for blank lines */
      | array
      | scalar
      ;

 array: '@' string strings ;

 scalar: string strings ;

 strings: string
        | strings string
        ;

以上要求strings非空,因此line需要至少包含其中两个。那可能是也可能不是你想要的。