1

我正在尝试解析这样的文件:(对于我的实际目的来说太简单了,但一开始,这没关系)

@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)它不能读取一个句子,即如果 Author="Some Value" 的 RHS,它只显示 "Some. 即空间未处理。不知道该怎么做。2)如果我用{}而不是“”将RHS括起来,它会给出语法错误。为这2种情况寻求帮助。

4

1 回答 1

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 如何定义如何转义 a 。

于 2013-05-03T06:58:36.237 回答