gpt4 book ai didi

linux - 使用 yacc 和 lex 的 Linux 命令行语法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:00 25 4
gpt4 key购买 nike

我想写下一个正式的语法来描述一些 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 文件??

最佳答案

我听不懂你的语法,但这里有一个基本的简化版本,可以帮助你入门。

注意:返回的字符串是 strdup()ed。他们真的应该在使用后被释放。

这是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" in cl.l

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

关于linux - 使用 yacc 和 lex 的 Linux 命令行语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16331973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com