使用flex和bison解析空间和大括号失败

时间:2013-05-02 14:13:02

标签: parsing bison flex-lexer

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

@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,则会出现语法错误。 寻求这种情况的帮助。

1 个答案:

答案 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如何定义如何逃避",如果可能的话。