%{
#include "date.h"
-#include "gedcom_date.tab.h"
+#include "gedcom_date.tabgen.h"
#define YY_NO_UNPUT
gedcom_date_lval.string = buf[token_nr++]; \
return TOKEN; \
}
+
+#define ACTION_UNEXPECTED \
+ { gedcom_date_error(_("Unexpected input")); \
+ return BADTOKEN; \
+ }
+
+#define UNKNOWN_CALENDAR_TYPE \
+ { gedcom_date_error(_("Unknown calendar type")); \
+ return BADTOKEN; \
+ }
%}
[ \t]+ /* ignore whitespace between tokens */
@#DJULIAN@ SIMPLE_RETURN(ESC_DATE_JULN)
@#DHEBREW@ SIMPLE_RETURN(ESC_DATE_HEBR)
"@#DFRENCH R@" SIMPLE_RETURN(ESC_DATE_FREN)
+@#.+@ UNKNOWN_CALENDAR_TYPE
FROM SIMPLE_RETURN(MOD_FROM)
TO SIMPLE_RETURN(MOD_TO)
"/" SIMPLE_RETURN(SLASH)
[0-9]+ SIMPLE_RETURN(NUMBER)
+. ACTION_UNEXPECTED
+
%%
+int get_date_token(const char* str)
+{
+ int token;
+ YY_BUFFER_STATE buffer;
+
+ token_nr = 0;
+ yy_delete_buffer(YY_CURRENT_BUFFER);
+ buffer = yy_scan_string(str);
+ token = yylex();
+ yy_delete_buffer(buffer);
+ return token;
+}
+
+int get_year_tokens(const char* str, char** year1, char** year2)
+{
+ int token;
+ int num_tokens = 0;
+ YY_BUFFER_STATE buffer;
+
+ token_nr = 0;
+ yy_delete_buffer(YY_CURRENT_BUFFER);
+ buffer = yy_scan_string(str);
+
+ token = yylex();
+ switch (token) {
+ case NUMBER: {
+ *year1 = buf[token_nr - 1];
+ token = yylex();
+ switch (token) {
+ case SLASH: {
+ token = yylex();
+ switch (token) {
+ case NUMBER:
+ *year2 = buf[token_nr - 1];
+ num_tokens = 2; break;
+ default:
+ num_tokens = 0;
+ }
+ break;
+ }
+ case 0: num_tokens = 1; break;
+ default: num_tokens = 0;
+ }
+ break;
+ }
+ case 0: num_tokens = 0; break;
+ default: num_tokens = 0;
+ }
+ yy_delete_buffer(buffer);
+ return num_tokens;
+}
+
int yywrap()
{
return 1;
static YY_BUFFER_STATE hndl;
-void init_gedcom_date_lex(char* string)
+void init_gedcom_date_lex(const char* string)
{
token_nr = 0;
hndl = yy_scan_string(string);