2013-05-02 67 views
0

我试图解析这样的文件:(我的实际目的太简单了,但开始的时候,这是确定)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种情况的帮助。

+0

请帮忙吗? – BaRud 2013-05-02 22:44:09

回答

1

主要问题是您的代币不合适。你应该尝试识别您的例子的令牌如下:

@Book  ENTRYTYPE 
{   '{' 
key2   KEY 
,   ',' 
Author  KEY 
=   '=' 
"Some2VALUE" VALUE 
,   ',' 
Title  KEY 
=   '=' 
"VALUE2"  VALUE 
}   '}' 

价值代币可以例如被定义如下:

%x value 
%% 
"\""   {BEGIN(value);} 
<value>"\"" {BEGIN{INITIAL); return VALUE;} 
<value>"\\\"" { /* escaped " */ } 
<value>[^"] { /* Non-escaped char */ } 

或单个表达

"\""([^"]|("\\\""))*"\"" 

这是假设只有"需要逃脱\。我不确定BibTeX如何定义如何逃脱",如果可能的话。

+0

感谢您的帮助,它向前迈进了一大步。没有意识到这种方式:'“\”“{BEGIN {INITIAL}; return VALUE;}' 但是bibtex有点复杂,{}或者”可以嵌套。 但谢谢你的帮助。 – BaRud 2013-05-03 11:09:29

+0

嵌套的'{}'可能在语法中得到了最好的解决。一般情况下,嵌套对于扫描仪来说太多了,但也可以用'<..>'开始条件和一些嵌套计数代码。然而,在语法中建模嵌套更自然。 – 2013-05-03 11:44:38

+0

也许是我的错,但是......我也在通过语法来解决它。所以我试图让词法分析器达到最小化,并且想用解析器来解决它。据我所知,尽管词法分析器可以为理想情况做得很好,但对于大多数真实世界的bibtex,我需要用野牛(解析器)来处理它。 – BaRud 2013-05-03 13:05:56