0
大学にC言語のミニシェルを作るプロジェクトがあります。コマンドラインを解析するために私はツールlexとyaccを使います。しかし、私はラインを解析したい。トークンが検出されたら、私のstructコマンドで引数を追加し、改行を見つけるとyyparseを実行してコマンドを実行します。印刷プロンプトとrelauchパース... マイlexのファイルの後:改行の後にyyparse関数を終了する方法は?
Chiffre [0-9]
Lettre [a-zA-Z]
Alphanum ({Chiffre}{Lettre})+
%{
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "parser.tab.h"
%}
%%
[ \t]+ {}
"\n" {
return '\n';
}
"||" {
return OR;
}
"|" {
return PIPE;
}
"&&" {
return AND;
}
"&" {
return AMPERSAND;
}
"2>" {
return ERR_GREAT;
}
">&" {
return GREAT_AMP;
}
"2>>" {
return ERR_GREAT_GREAT;
}
">>&" {
return GREAT_GREAT_AMP;
}
">>" {
return GREAT_GREAT;
}
">" {
return GREAT;
}
"<" {
return LESS;
}
";" {
return SEMICOLON;
}
"exit" {
return EXIT;
}
({Lettre}_){1}({Alphanum}_) {
return IDENTIFIER;
}
[^ \t|><&\;][^ \t|><&\;]* {
return WORD;
}
%%
int yywrap(void){return 1;}
私は、出口はyyparse用YYACCEPTを使用しようとしたが動作しません。 のyaccファイル:
%{
#include <stdio.h>
void yyerror(const char *s);
extern int yylex();
extern char* yytext;
%}
%token PIPE AND OR AMPERSAND BLANK WORD IDENTIFIER GREAT GREAT_GREAT LESS ERR_GREAT ERR_GREAT_GREAT GREAT_AMP GREAT_GREAT_AMP SEMICOLON EXIT
%start cmd_lists
%union { char str[256]; int val; }
%error-verbose
%%
list_arg: list_arg WORD | /*empty*/;
cmd_args: WORD list_arg io_list;
pipeline: pipeline PIPE cmd_args | pipeline SEMICOLON cmd_args | pipeline AND cmd_args | pipeline OR cmd_args | cmd_args ;
io: GREAT WORD | GREAT_GREAT WORD | LESS WORD | ERR_GREAT WORD | ERR_GREAT_GREAT WORD | GREAT_AMP WORD | GREAT_GREAT_AMP WORD;
io_list: io_list io | /*empty*/ ;
background: AMPERSAND | /*empty*/ ;
command: pipeline background '\n'{
printf("cmd newline\n");
YYACCEPT;
}
|'\n'{
printf("newline\n");
YYACCEPT;
}
|EXIT '\n'{
printf("exit newline\n");
YYACCEPT;
}
;
cmd_lists: cmd_lists command | ;
%%
void yyerror(const char *s){
fprintf(stderr,"yyerror : erreur : %s.\n",s);
}
はあなたの助けをいただき、ありがとうございます。
ありがとうございました。私はcmd_list行(cmd_lists:cmd_listsコマンド|;)を削除し、%start cmd_listを%startコマンドに置き換えます。しかし、「exit」と入力するか、改行だけを入力しても何も起こりません。 printfを追加しても何も表示されません。 – Oneill