2016-10-01 19 views
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); 
    } 

はあなたの助けをいただき、ありがとうございます。

答えて

0
cmd_lists: cmd_lists command | ; 

これは通常、上部に、下部には置かれていますが、これは端末記号のようです。とにかく、この文法ではcmd_listにはゼロ個以上のcommandの項目が含まれている可能性があるため、パーサーは別のものを受け入れることによって正しく動作します。

これが必要ない場合は、cmd_listの生産物を削除してください。

+0

ありがとうございました。私はcmd_list行(cmd_lists:cmd_listsコマンド|;)を削除し、%start cmd_listを%startコマンドに置き換えます。しかし、「exit」と入力するか、改行だけを入力しても何も起こりません。 printfを追加しても何も表示されません。 – Oneill

関連する問題