Статические переменные в основном используются для констант.
Здесь вы объявили static и присвоили ему экземпляр SimpleDateFormat
.
Либо сделайте DATE_TIME_FORMAT
нестатичным, либо присвойте этой переменной постоянную.
Лучше поменяйте его на переменную экземпляра и используйте Sting для этого.
например, public final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss:SSS";
You don't need to do anything with flex or bison to use C++, I have done it many times. You just have to make sure you use g++, not gcc.
Your problems are with the Makefile, not the code.
For using flex with C++:
1: read the flex docs:
2: use flex -+ -o file.cc parser.ll
3: In the .ll file:
%option c++
%option yyclass="Your_class_name"
%option batch
4: In your .hh file, derive Your_class_name from public yyFlexLexer
5: you can then use your_class_instance.yylex()
Есть некоторые отличия, которые вы можете проверить подробно здесь .
Use either a C Compiler or a C++ compiler but not both (till you know what you are upto). You are sure to shoot yourself many times on both your feet otherwise. Mixing gcc and g++ isn't good.
This line is suspect:
lex.yy.o: scan.l parse.tab.h attr.h # added this ...
gcc -c -o lex.yy.o lex.yy.c
Also, you don't seem to be using CC
anywhere, using that'd have made life easier.
Assuming you don't change a single line of the C code, you will possibly hit some errors and quite a few warnings (like deprecated headers etc). You'll have to fix them as well.
Если вы делаете парсеры в C ++, я бы рекомендовал взглянуть на Boost Spirit . С ним гораздо приятнее обращаться, чем с bison / yacc.
Из здесь :
Spirit - это объектно-ориентированная среда генератора синтаксического анализатора с рекурсивным спуском, реализованная с использованием методов мета-программирования шаблонов. Шаблоны выражений позволяют нам полностью аппроксимировать синтаксис расширенной формы Backus-Normal (EBNF) в C ++.