0
大学にC言語のミニシェルを作るプロジェクトがあります。 コマンドラインを解析するには、ツールlexとyaccを使用します。 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ファイルを変更した
'bison' ?,' yacc '?を実行すると、 "LANG = C bison options bla bla bla"というようになります。 'LANG = C'と書くと、バイソンはシステムのロケールを英語にして、英語の警告を出すようにします。 –
'yacc'や' bison'をCロケール( 'LC_ALL = C yacc parser.yacc')で呼び出せますか?そうすれば、警告メッセージは英語で表示され、何が起こっているのかを知る人が増えます。 (読むことができない人のために、基本的に、すべてのプロダクションと非終端は「未使用」とマークされています。) –
こんにちは、それは編集されています。 – Oneill