我试图解析这样的文件:(我的实际目的太简单了,但开始的时候,这是确定)Flex和野牛解析失败空间和支柱
@Book{key2,
Author="Some2VALUE" ,
Title="VALUE2"
}
的词法分析器:
%union
{
char *sval;
};
%token <sval> ENTRYTYPE
%type <sval> VALUE
%token <sval> KEY
%start Input
%%
Input: Entry
| Input Entry ; /* input is zero or more entires */
Entry:
ENTRYTYPE '{' KEY ','{
b_entry.type = $1;
b_entry.id = $3;
b_entry.table = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);}
KeyVals '}' {
parse_entry(&b_entry);
g_hash_table_destroy(b_entry.table);
free(b_entry.type); free(b_entry.id);
b_entry.table = NULL;
b_entry.type = b_entry.id = NULL;}
;
KeyVals:
/* empty */
| KeyVals KeyVal ; /* zero or more keyvals */
VALUE:
/*empty*/
| KEY
| VALUE KEY
;
KeyVal:
/*empty*/
KEY '=' VALUE ',' { g_hash_table_replace(b_entry.table, $1, $3); }
| KEY '=' VALUE { g_hash_table_replace(b_entry.table, $1, $3); }
| error '\n' {yyerrok;}
;
很少有问题,所以,我需要概括既词法分析器和参数:
[A-Za-z"][^\\\" \n\(\),=\{\}#~_]* { yylval.sval = strdup(yytext); return KEY; }
@[A-Za-z][A-Za-z]+ {yylval.sval = strdup(yytext + 1); return ENTRYTYPE;}
[ \t\n] ; /* ignore whitespace */
[{}=,] { return *yytext; }
. { fprintf(stderr, "Unrecognized character %c in input\n", *yytext); }
然后用这个解析ser: 1)它不能读取一个句子,即如果作者的RHS =“某个值”,它只显示“Some”。即没有处理空间。不知道该怎么做。 2)如果我用{}而不是“”包含RHS,它会给出语法错误。 寻找这2种情况的帮助。
请帮忙吗? – BaRud 2013-05-02 22:44:09