我正在尝试解析这样一个文件:(对于我的实际目的来说太简单了,但是从一开始就没关系)
@Book{key2,
Author="Some2VALUE" ,
Title="VALUE2"
}
词法分析器是:
[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); }
然后用以下方法解析:
%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;}
;
问题很少,所以我需要概括词法分析器和解析器: 1)它不能读一个句子,即如果作者的RHS =“某些价值”,它只显示“有些。即空间没有处理。不知道怎么做。 2)如果我用“}而不是”“包含RHS,则会出现语法错误。 寻求这种情况的帮助。
答案 0 :(得分:1)
主要问题是您的令牌不合适。您应该尝试按如下方式识别示例的标记:
@Book ENTRYTYPE
{ '{'
key2 KEY
, ','
Author KEY
= '='
"Some2VALUE" VALUE
, ','
Title KEY
= '='
"VALUE2" VALUE
} '}'
例如,VALUE令牌可以定义如下:
%x value
%%
"\"" {BEGIN(value);}
<value>"\"" {BEGIN{INITIAL); return VALUE;}
<value>"\\\"" { /* escaped " */ }
<value>[^"] { /* Non-escaped char */ }
或者在单个表达式中
"\""([^"]|("\\\""))*"\""
这假设只有"
需要使用\
进行转义。我不确定BibTeX如何定义如何逃避"
,如果可能的话。