我正在开发一个创建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:错误:预期的标识符或'('字符串常量之前。
谁能告诉我我犯的错误是什么?
答案 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.