DOM解析器使用Flex和Bison

时间:2013-03-17 02:09:18

标签: bison flex-lexer

我正在开发一个创建DOM解析器的项目。在初始阶段,我只是想弄清楚给定文件中有多少标签。假设我有一个XML文件,其内容有点像这样:<abc>这是测试文件</abc> 为此,我只想解析两个标签<abc></abc>。为此,我使用Flex和Bison编写语法,以便每当这个语法出现时我执行我的代码。这是我的野牛代码:

%{
    #include <stdio.h>
    #include <conio.h>
    int yylex();
    int yyparse();
    FILE *yyin;
    int yylineno;
    void yyerror(const char*);
%}

%token START_TAG END_TAG 

%%
tag:
    sTag
    | eTag
    ;
sTag:
    START_TAG {printf("start tag encountered");}
    ;
eTag:
    END_TAG
    ;
%%
int main(){
    FILE *myFile;
    myFile = fopen("G:\\MCA-2\\project\\09-03-2013\\demo.txt","r");
    if(!myFile){
        printf("error opening file");
    }
    yyin = myFile;
    do{
        yyparse();
    } while(!feof(yyin));
    fclose(myFile);
    return 0;
}

这是我的Flex代码:

%{
    #include "xml.tab.h"
    #define YY_DECL extern "C" int yylex()
%}

%option noyywrap
%option yylineno
alpha [a-zA-Z]
digit [0-9]
%%
[ \t] {}
[ \n] {}
{alpha}({alpha}|{digit})* return START_TAG;
%%

当我尝试编译时,我收到如下错误:

lex.yy.c:529:1:错误:预期的标识符或'('字符串常量之前。

谁能告诉我我犯的错误是什么?

1 个答案:

答案 0 :(得分:0)

(评论中回答的问题;见:Question with no answers, but issue solved in the comments (or extended in chat)

@rici提供了答案。由于flex正在为gcc编译器生成C代码完全删除#define YY_DECL行,因为默认声明没问题。每次更改flex文件时都不要忘记运行flex,以重新生成lex.yy.c.声明extern "C"...仅在C ++中有效,而在C中无效,通常file.c将被编译为C.