Flex/Bison -匹配随机数据



我正在使用flex/Bison实现自定义CLI。我的示例命令如下所示:

zone 3 set field some_value

中可以匹配zone和set等关键字,还可以在field的位置匹配string。然而,在some_value可以是任何东西,包括关键字,如'zone'。问题是flex在some_value的位置上识别像'zone'这样的关键字。

此外,我想要空格和任何打印字符来代替some_value。

这是我的flex:

%option noyywrap nounput noinput
%option reentrant bison-bridge
digit [0-9]
integer [+-]?{digit}+
real [+-]?({digit}+[.]{digit}*)|({digit}*[.]{digit}+)
exp [+-]?({integer}|{real})[eE]-?{integer}
alpha [a-z][A-Z]+

%%

/*subsystems*/
zone {
return (cmd_sys_zone);
}
device {
return (cmd_sys_device);
}
system {
return (cmd_sys_system);
}
help {
return (cmd_sys_help);
}
ver|version {
return (cmd_sys_ver);
}
/*actions*/
set {return (cmd_action_set);}
get {return (cmd_action_get);}
start {return (cmd_action_start);}
stop {return (cmd_action_stop);}

/*Primitives*/
{integer} {
yylval->number = strtoul(yytext, NULL, 0);
return(cmd_num);
}
{real} {
yylval->real = strtod(yytext, NULL);
return(cmd_real);
}
{exp} {
yylval->real = strtod(yytext, NULL);
return(cmd_real);
}
[[:alpha:]]* {
yylval->name = strdup(yytext);
return(cmd_string);
}
[nr] {
}
[[:space:]]+  {
//return(cmd_space);
} /* Do nothing */
. {
yylval->name = strdup(yytext);
showError();
//    return(cmd_other);
}
%%

void showError(){
printf("Other input ");
}
int cmd_parse(cmd_t *command) {
yyscan_t scanner;
YY_BUFFER_STATE buffer;
int ret_val;
ret_val = 0;
if ((ret_val = yylex_init(&scanner)) != 0) {
goto exit_point;
}
buffer = yy_scan_buffer(command->buffer, command->len, scanner);
yyparse(command, scanner);
yy_delete_buffer(buffer, scanner);
yylex_destroy(scanner);
exit_point:
return 0;
}

这是我的愿景:

%{
#include <stdio.h>
#include <stdint.h>
#include "cmd.h"
#include "hmd.tab.h"
int yylex();
int yyerror(void *userdata, void *scanner, const char *s);
%}
%define api.pure
%define parse.error verbose
/*System tokens*/
%token cmd_sys_zone cmd_sys_device cmd_sys_system cmd_sys_ver cmd_sys_help
%token cmd_num cmd_string cmd_real
/*Action tokens*/
%token cmd_action_set cmd_action_get cmd_action_start cmd_action_stop
%type <number> cmd_num
%type <real> cmd_real
%type <name> cmd_string
%destructor {
if ($$ == NULL) {
free($$);
}
} <name>
%union {
char *name;
uint64_t number;
double real;
}

%parse-param {void *user_data}
%param {void *scanner}
%%
prog:
stmts
;
stmts:
| stmt stmts
stmt:
cmd_sys_zone cmd_num cmd_action_set cmd_string cmd_string {
cmd_zone_set(user_data, $2, $4, $5);
cmd_free($4);
cmd_free($5);
} |
cmd_sys_zone cmd_num cmd_action_get cmd_string {
cmd_zone_get($2, $4);
cmd_free($4);
} |
cmd_sys_ver {
cmd_ver(user_data);
} |
cmd_sys_help {
cmd_help();
}
%%
int yyerror(void *userdata, void *scanner, const char *s)
{
(void) scanner;
(void) userdata;
printf("Syntax Error on line %sn", s);
return 0;
}

我尝试匹配。*$,因为我的数据总是在输入的末尾,但这不起作用。

你必须使用'start states'。这是Flex的一个特性。

最新更新