c - 为什么 YACC 会出现此警告?

标签 c bison yacc

我的大学有一个项目,用C语言制作一个迷你shell。 为了解析命令行,我使用以下工具:lex 和 yacc。 当使用 YACC 编译时,我收到这些警告,但我不明白为什么。

文件parser.yacc:

%{
#include <stdio.h>
void yyerror(char *s);
extern int yylex();
%}
%token NEWLINE PIPE AND OR AMPERSAND BLANK WORD IDENTIFIER GREAT GREAT_GREAT LESS ERR_GREAT ERR_GREAT_GREAT GREAT_AMP GREAT_GREAT_AMP SEMICOLON
%start cmd_lists
%%
cmd_lists
    : cmd_lists command
    |
    ;
command
    : pipeline io_list background NEWLINE
    | NEWLINE
    |  error NEWLINE
    ;
pipeline
    : pipeline PIPE cmd_args
    | pipeline SEMICOLON cmd_args
    | pipeline AND cmd_args
    | pipeline OR cmd_args
    | cmd_args
    ;
cmd_args
    : WORD list_arg
    ;
list_arg
    : list_arg WORD
    ;
io_list
    : io_list io
    ; 
background
    : AMPERSAND
    ; 
io
    : GREAT WORD
    | GREAT_GREAT WORD
    | LESS WORD
    | ERR_GREAT WORD
    | ERR_GREAT_GREAT WORD
    | GREAT_AMP WORD
    | GREAT_GREAT_AMP WORD
    ;
%%
void yyerror(char *s){
  fprintf(stderr,"yyerror : erreur : %s.\n",s);
}

还有警告:

parser.yacc: warning: 6 nonterminals useless in grammar[-Wother]
parser.yacc: warning: 17 rules useless in grammar [-Wother]
parser.yacc:13.10-17: warning: nonterminal useless in grammar: : pipeline [-Wother]
command: pipeline io_list background NEWLINE | NEWLINE |  error NEWLINE;
      ^^^^^^^^
parser.yacc:14.25-32: awarning: nonterminal useless in grammar: : cmd_args [-Wother]
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args;
                     ^^^^^^^^
parser.yacc:15.16-23:warning: nonterminal useless in grammar: : list_arg [-Wother]
cmd_args: WORD list_arg;
            ^^^^^^^^
parser.yacc:13.19-25: warning: nonterminal useless in grammar: : io_list [-Wother]
command: pipeline io_list background NEWLINE | NEWLINE |  error NEWLINE;
               ^^^^^^^
parser.yacc:13.27-36: warning: nonterminal useless in grammar: : background [-Wother]
command: pipeline io_list background NEWLINE | NEWLINE |  error NEWLINE;
                       ^^^^^^^^^^
parser.yacc:17.18-19: warning: nonterminal useless in grammar: : io [-Wother]
io_list: io_list io; 
              ^^
parser.yacc:13.10-44: warning: nonterminal useless in grammar:[-Wother]
command: pipeline io_list background NEWLINE | NEWLINE |  error NEWLINE;
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
parser.yacc:14.11-32: warning: nonterminal useless in grammar: [-Wother]
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args;
       ^^^^^^^^^^^^^^^^^^^^^^
parser.yacc:14.36-62: warning: nonterminal useless in grammar: [-Wother]
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args;
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
parser.yacc:14.66-86:warning: nonterminal useless in grammar:[-Wother]
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args;
                                                              ^^^^^^^^^^^^^^^^^^^^^
parser.yacc:14.90-109: warning: nonterminal useless in grammar: [-Wother]
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args;
                                                                                      ^^^^^^^^^^^^^^^^^^^^
parser.yacc:14.113-120: warning: nonterminal useless in grammar:[-Wother]
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args;
                                                                                                             ^^^^^^^^
parser.yacc:15.11-23: warning: warning: nonterminal useless in grammar:[-Wother]
cmd_args: WORD list_arg;
       ^^^^^^^^^^^^^
parser.yacc:16.11-23: warning: warning: nonterminal useless in grammar: [-Wother]
list_arg: list_arg WORD ;
       ^^^^^^^^^^^^^
parser.yacc:17.10-19: warning: nonterminal useless in grammar:[-Wother]
io_list: io_list io; 
      ^^^^^^^^^^
parser.yacc:18.13-21:warning: nonterminal useless in grammar:[-Wother]
background: AMPERSAND;
         ^^^^^^^^^
parser.yacc:19.5-14: warning: nonterminal useless in grammar:[-Wother]
io: GREAT WORD| GREAT_GREAT WORD| LESS WORD| ERR_GREAT WORD| ERR_GREAT_GREAT WORD| GREAT_AMP WORD| GREAT_GREAT_AMP WORD;
 ^^^^^^^^^^
parser.yacc:19.17-32: warning: nonterminal useless in grammar:[-Wother]
io: GREAT WORD| GREAT_GREAT WORD| LESS WORD| ERR_GREAT WORD| ERR_GREAT_GREAT WORD| GREAT_AMP WORD| GREAT_GREAT_AMP WORD;
             ^^^^^^^^^^^^^^^^
parser.yacc:19.35-43: warning: nonterminal useless in grammar: [-Wother]
io: GREAT WORD| GREAT_GREAT WORD| LESS WORD| ERR_GREAT WORD| ERR_GREAT_GREAT WORD| GREAT_AMP WORD| GREAT_GREAT_AMP WORD;
                               ^^^^^^^^^
parser.yacc:19.46-59: warning: nonterminal useless in grammar:[-Wother]
io: GREAT WORD| GREAT_GREAT WORD| LESS WORD| ERR_GREAT WORD| ERR_GREAT_GREAT WORD| GREAT_AMP WORD| GREAT_GREAT_AMP WORD;
                                          ^^^^^^^^^^^^^^
parser.yacc:19.62-81: warning: nonterminal useless in grammar: [-Wother]
io: GREAT WORD| GREAT_GREAT WORD| LESS WORD| ERR_GREAT WORD| ERR_GREAT_GREAT WORD| GREAT_AMP WORD| GREAT_GREAT_AMP WORD;
                                                          ^^^^^^^^^^^^^^^^^^^^
parser.yacc:19.84-97:warning: nonterminal useless in grammar:[-Wother]
io: GREAT WORD| GREAT_GREAT WORD| LESS WORD| ERR_GREAT WORD| ERR_GREAT_GREAT WORD| GREAT_AMP WORD| GREAT_GREAT_AMP WORD;
                                                                                ^^^^^^^^^^^^^^
parser.yacc:19.100-119: warning: nonterminal useless in grammar:[-Wother]
io: GREAT WORD| GREAT_GREAT WORD| LESS WORD| ERR_GREAT WORD| ERR_GREAT_GREAT WORD| GREAT_AMP WORD| GREAT_GREAT_AMP WORD;

我是 yacc 的新手。 感谢您的帮助。

最佳答案

我已将 parser.y 文件更改为,没问题:

 %{
#include <stdio.h>
void yyerror(char *s);
extern int yylex();
%}
%token NEWLINE PIPE AND OR AMPERSAND BLANK WORD IDENTIFIER GREAT GREAT_GREAT LESS ERR_GREAT ERR_GREAT_GREAT GREAT_AMP GREAT_GREAT_AMP SEMICOLON
%start cmd_lists 
%%
cmd_lists: cmd_lists command | ;
command: pipeline io_list background NEWLINE | NEWLINE |  error NEWLINE;
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args;
cmd_args: WORD list_arg;
list_arg: list_arg WORD | /*empty*/;
io_list: io_list io| /*empty*/ ;
background: AMPERSAND | /*empty*/ ;
io: GREAT WORD | GREAT_GREAT WORD | LESS WORD | ERR_GREAT WORD |  ERR_GREAT_GREAT WORD | GREAT_AMP WORD | GREAT_GREAT_AMP WORD;
%%

void yyerror(char *s){
  fprintf(stderr,"yyerror : erreur : %s.\n",s);
}

谢谢。

关于c - 为什么 YACC 会出现此警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765190/

相关文章:

yacc - Bison 文件结尾

c - 具有启动条件的 Flex 可重入

parsing - 分号作为由 flex/bison 解析的自定义语法中的分隔符

c++ - #定义为无符号字符

android - 是否可以在Android上运行C程序

c - 用于收集参数的 Bison 语法

algorithm - 学习 Bison : What are context-free grammars and LALR(1)?

c++ - 与通配符匹配的文件名

Android NDK/JNI UnsatisfiedLinkError With .So library

c++ - 用于从文件填充类的 Lexer/Parser 的语法规则