加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

解析 – 用flex bison解析bibtex:重新访问

发布时间:2020-12-15 02:15:30 所属栏目:百科 来源:网络整理
导读:在过去的几周里,我正在尝试使用flex和bison为bibtex( http://www.bibtex.org/Format/)文件编写解析器. $cat raw.l%{#include "raw.tab.h" %}value ["{][a-zA-Z0-9 .t{} "]*["}]%%[a-zA-Z]* return(KEY);" return(QUOTE);{ return(OBRACE);} ret
在过去的几周里,我正在尝试使用flex和bison为bibtex( http://www.bibtex.org/Format/)文件编写解析器.
$cat raw.l
%{
#include "raw.tab.h" 
%}
value ["{][a-zA-Z0-9 .t{} "]*["}]
%%
[a-zA-Z]*               return(KEY);
"                          return(QUOTE);
{                          return(OBRACE);
}                          return(EBRACE);
;                           return(SEMICOLON);
[ t]+                  /* ignore whitespace */;
{value}     {
    yylval.sval = malloc(strlen(yytext));
    strncpy(yylval.sval,yytext,strlen(yytext));
    return(VALUE);
}

$cat raw.y
%{
#include <stdio.h>
%}

//Symbols.
%union
{
 char *sval;
};
%token <sval> VALUE
%token KEY
%token OBRACE
%token EBRACE
%token QUOTE
%token SEMICOLON 

%start Entry
%%

Entry:
     '@'KEY OBRACE VALUE ',' 
     KeyVal
     EBRACE
     ;

KeyVal:
      /* empty */
      | KeyVal '=' VALUE ','
      | KeyVal '=' VALUE 
      ;
%%

int yyerror(char *s) {
  printf("yyerror : %sn",s);
}

int main(void) {
  yyparse();

}

%%
样本bibtex是:

@Book{a1,author = "a {"m}ook,Rudra Banerjee",Title="ASR",Publisher="oxf",Year="2010",Add="UK",Edition="1",}
@Article{a2,Author="Rudra Banerjee",Title="Fe{"Ni}Mo",Publisher={P{"R}B},Issue="12",Page="36690",Year="2011",}

当我试图解析它时,它给出了语法错误.使用GDB,它显示它期望在KEY中声明字段(可能),

Reading symbols from /home/rudra/Programs/lex/Parsing/a.out...done.
(gdb) Undefined command: "".  Try "help".
(gdb) Undefined command: "Author".  Try "help".
(gdb) Undefined command: "Editor".  Try "help".
(gdb) Undefined command: "Title".  Try "help".
.....

如果有人在这方面帮助我,我将不胜感激.

解决方法

很多问题.首先,你的词法分析器很困惑,试图将引用的字符串和支撑的东西识别为单个VALUE,并尝试识别单个字符,如“和{.对于引号,让词法分析器识别整个字符串是有意义的,但对于结构你要解析的东西(比如支撑列表),你需要返回单个标记以供解析器解析.其次,在为字符串分配空间时,你没有为NUL终结符分配空间.最后,你的语法看起来很像奇怪的是,想要解析诸如= VALUE = VALUE之类的东西作为KeyValue,它与bibtex文件中的任何东西都不对应.

首先,对于词法分析者.您想要识别引用的字符串和标识符,但其他内容应该是单个字符:

[A-Za-z][A-Za-z0-9]*      { yylval.sval = strdup(yytext); return KEY; }
"([^"]|.)*"          { yylval.sval = strdup(yytext); return VALUE; }
[ tn]                   ; /* ignore whitespace */
[{}@=,]                   { return *yytext; }
.                         { fprintf(stderr,"Unrecognized character %c in inputn",*yytext); }

现在您需要一个解析器来输入:

Input: /* empty */ | Input Entry ;  /* input is zero or more entires */
Entry: '@' KEY '{' KEY ',' KeyVals '}' ;
KeyVals: /* empty */ | KeyVals KeyVal ; /* zero or more keyvals */
KeyVal: KEY '=' VALUE ',' ;

这应该解析你给出的例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读