1

いくつかの GNU/Linux ツールのコマンド ラインの使用法を説明するための正式な文法を書き留めたいと思います。

まず、文法を定義したいと思います:

Start -> COMMAND AXIS 

AXIS -> EMPTY | INTER

INTER -> VALUE | -OPT

VALUE -> any characters for files 

OPT -> OPION AXIS

OPTION -> WORD

WORD -> out | in | ... | LETTERS

LETTERS -> aLETTER |bLETTER | ... | zLETTER

LETTER -> a| b | c | ... | EMPTY | LETTERS

EMPTY -> 

COMMAND -> ls | tar | touch | openssl | vi | ... | cat 

この文法を lex と yacc で使用して、コマンドを解析します。.l & .c ファイルを定義するにはどうすればよいですか??

4

1 に答える 1

2

あなたの文法を理解するのに苦労しましたが、ここに簡単な基本的なバージョンがあります。

注: 返される文字列は strdup() されます。使用後は実際に解放する必要があります。

ここにcl.lがあります

%{
#define YYSTYPE char*
#include "y.tab.h"
%}

%%

ls|tar|touch|openssl|vi|cat     { yylval = strdup(yytext); return COMMAND; }

[A-Za-z0-9]+    { yylval = strdup(yytext); return VALUE; }

-[A-Za-z0-9]+   { yylval = strdup(yytext); return OPTION; }

[ \t]   /* ignore whitespace */ ;

\n { return EOL; }

%%

ここにcl.yがあります

%{
#include <stdio.h>
#include <string.h>
#define YYSTYPE char *
%}

%token COMMAND VALUE OPTION EOL
%%

start: command EOL  { return 0; }

command: COMMAND  axis {printf("Command %s\n", $1);}
      | COMMAND {printf("Command %s\n", $1);}

axis: inter | axis inter ;

inter: VALUE  {printf("Inter value %s\n", $1);}
       | OPTION {printf("Inter option %s\n", $1);}
%%
int main (void) {
    return yyparse();
}

int yyerror (char *msg) {
    return fprintf (stderr, "Error: %s\n", msg);
}

yacc を使用してビルドするには:

flex cl.l
yacc -d cl.y
gcc -o cl y.tab.c lex.yy.c -lfl

bison を使用してビルドするには:

に変更#include "y.tab.h"_#include "cl.tab.h"cl.l

flex cl.l
bison -d cl.y
gcc -o cl cl.tab.c lex.yy.c -lfl
于 2013-05-02T13:32:31.760 に答える