0

DOM パーサーを作成するプロジェクトに取り組んでいます。初期段階では、指定されたファイルにタグがいくつあるかを把握しようとしています。内容が次のような XML ファイルがあるとします。これ<abc>は test file</abc> です。このため、私は Flex と Bison を使用して文法を記述し、この文法が発生するたびにコードを実行します。これは私のバイソンコードです:<abc></abc>

%{
    #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: エラー: 文字列定数の前に識別子または '(' が必要です。

誰が私が犯している間違いを教えてもらえますか?

4

1 に答える 1

0

(コメントで回答された質問。参照:回答がない質問ですが、コメントで解決された問題 (またはチャットで拡張) )

@riciが答えを提供しました。flex は gcc コンパイラ用の C コードを生成しているため、デフォルトの宣言で問題ないため、この行を完全に削除します#define YY_DECLflex ファイルを変更するたびに flex を実行して、lex.yy.c を再生成することを忘れないでください。この宣言extern "C"...は、C ではなく C++ でのみ有効であり、通常file.cは C としてコンパイルされます。

于 2015-01-24T13:06:58.593 に答える