【发布时间】:2015-08-01 17:57:38
【问题描述】:
我必须写什么而不是
identifier [a-zA-Z0-9]+
为了也接受仅由数字完成的字符串?
我编写了新的 bison 和 flex 文件以明确我的问题。 野牛档案:
%{
#include <stdio.h>
#include <string>
using namespace std;
extern int yylex();
extern void yyerror(char*);
%}
//Symbols
%union
{
double double_val;
char *str_val;
};
%token START
%token STOP
%token BEGIN_NUM
%token END_NUM
%token BEGIN_STRING
%token END_STRING
%token <double_val> NUMBER
%token <str_val> IDENTIFIER
%start MyTest
%%
MyTest:
START Block STOP
;
Block:
/* empty */
| Block BEGIN_STRING IDENTIFIER END_STRING { printf("received string: %s \n", $3); }
| Block BEGIN_NUM NUMBER END_NUM { printf("received number: %f \n", $3); }
;
%%
弹性文件:
%{
#include <string>
#include "test.tab.h"
void yyerror(char*);
int yyparse(void);
%}
blanks [ \t\n]+
identifier [a-zA-Z0-9]+
number [0-9][0-9]*(.[0-9]+)?
%%
{blanks} { /* ignore */ };
"<test>" return(START);
"</test>" return(STOP);
"<string>" return(BEGIN_STRING);
"</string>" return(END_STRING);
"<num>" return(BEGIN_NUM);
"</num>" return(END_NUM);
{number} { yylval.double_val = atof(yytext);
return(NUMBER);
}
{identifier} {
yylval.str_val=strdup(yytext);
return(IDENTIFIER);
}
%%
void yyerror (char* str){ printf (" ERROR : Could not parse! %s\n", str );}
int yywrap (void){ }
int main(int num_args, char** args){
if(num_args != 2) {printf("usage: ./parser filename\n"); exit(0);}
FILE* file = fopen(args[1],"r");
if(file == NULL) {printf("couldn't open %s\n",args[1]); exit(0);}
yyin = file;
yyparse();
fclose(file);
}
当我输入这个文件时一切正常:
<test>
<num>1</num>
<string>eeeeee</string>
<num>2</num>
<string>cccc</string>
<num>3</num>
<num>4</num>
<string>asaa</string>
<string>dsa</string>
</test>
但是,如果我将字符串的一个字段更改为只有数字的值,例如:
<string>323</string>
我收到语法错误...
【问题讨论】:
标签: string compiler-construction bison