%{
       #include <iostream>
       #include <map>
       #include <string>
       using namespace std;
       long posy, counter = 1;
       map<long, long> ind;
       map<long, string> notes;
       template<typename T> T cut(const char* s);
%}

%option outfile="footnotes.cpp" c++ 8bit warn noyywrap yylineno full
%x FOOT TAIL

%%

                                                       { cout << YYText(); }
\[[[:digit:]]+\]                        { ind.insert(pair<int, int>(cut<long>(YYText()), counter)); cout << "[" << counter++ << "]"; }
^"@footnote:"\n                         { cout << YYText(); counter = 1; } BEGIN(FOOT);
<FOOT>^\[[[:digit:]]+\]         { posy = ind[cut<long>(YYText())]; } BEGIN(TAIL);
<TAIL>.*\n                                      { notes[posy] = string(YYText()); } BEGIN(FOOT);

%%

int main(long argc, char* argv[]) {
       if (argc == 1)
               freopen(argv[1], "r", stdin);

       yyFlexLexer flex;
       while (flex.yylex());
       for (map<long, string>::iterator b = notes.begin(), e = notes.end(); b != e; ++b, ++counter)
               cout << "[" << b->first << "]" << b->second;
}

template<typename T> T cut(const char* s) {
       T ret = NULL;
       sscanf(s, "[%d]", &ret);
       return ret;
}