%{ /* * Author: Pierangelo Masarati * E-mail: masarati@aero.polimi.it * Date: August, 1999 * Version: 1.0 * Description: * LDAP client to build a BibTeX database out of * a Directory Server, with migration tools. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by Pierangelo Masarati. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include #include #include #include #include "l2b_utils.h" #include "bibtex2ldif.tab.h" /*#define TEST_LEXER*/ int str_caller = INITIAL; static char *buf = NULL; static char *bibtex2ldif_strcat(char *b, char *s); static void bibtex2ldif_free(char *b); %} %option yylineno metacomment ^[%#].*\n attribute Abstract|Acknowledgement|Address|Annote|Booktitle|Chapter|Crossref|Edition|Editor|Howpublished|Isbn|Issn|Institution|Journal|Key|Keywords|Lccn|Month|Note|Number|Organization|Pages|Price|Publisher|School|Series|String|Title|Type|Volume|Year|abstract|acknowledgement|address|annote|booktitle|chapter|crossref|edition|editor|howpublished|isbn|issn|institution|journal|key|keywords|lccn|month|note|number|organization|pages|price|publisher|school|series|string|title|type|volume|year|ABSTRACT|ACKNOWLEDGEMENT|ADDRESS|ANNOTE|BOOKTITLE|CHAPTER|CROSSREF|EDITION|EDITOR|HOWPUBLISHED|ISBN|ISSN|INSTITUTION|JOURNAL|KEY|KEYWORDS|LCCN|MONTH|NOTE|NUMBER|ORGANIZATION|PAGES|PRICE|PUBLISHER|SCHOOL|SERIES|STRING|TITLE|TYPE|VOLUME|YEAR|language|Language|LANGUAGE /*Bibdate|Coden|Day*/ entrytype Article|Book|Booklet|Conference|InBook|InCollection|InProceedings|Manual|Mastersthesis|MastersThesis|Misc|Phdthesis|PhdThesis|Proceedings|TechReport|Unpublished|article|book|booklet|conference|inbook|incollection|inproceedings|manual|mastersthesis|misc|phdthesis|proceedings|techreport|unpublished|ARTICLE|BOOK|BOOKLET|CONFERENCE|INBOOK|INCOLLECTION|INPROCEEDINGS|MANUAL|MASTERSTHESIS|MISC|PHDTHESIS|PROCEEDINGS|TECHREPORT|UNPUBLISHED url url|Url|URL author author|Author|AUTHOR string string|String|STRING preamble preamble|Preamble|PREAMBLE comment comment|Comment|COMMENT authorsep and whitespace [\t\n ] %x COMMENT %x COMMENT_BODY %x STRING %x STRING_BODY %x PREAMBLE %x PREAMBLE_BODY %x URL %x AUTHOR %x AUTHOR_BODY %x URL_BODY %x TYPE %x ENTRY %x ENTRYTAG %x VALUE %x STRING_VALUE %x STR %s STR_ESCAPE %% {metacomment}+ /* skip comments */ {whitespace}+ /*return E_WHTSP; skip whitespaces */ "@" BEGIN(TYPE); return E_START; "{" return E_LCUBR; "}"$ BEGIN(INITIAL); return E_RCUBR; "=" BEGIN(VALUE); return E_ASSIGN; "=" return E_ASSIGN; "," return E_SEP; "," BEGIN(ENTRY); return E_SEP; "\"" { str_caller = YY_START; bibtex2ldif_free(buf); buf = NULL; BEGIN(STR); } [^ \n\t,"][^\n\t,"]+ (char *)yylval = strdup(yytext); return E_TEXT_A; {comment} BEGIN(COMMENT); return E_COMMENT; {string} BEGIN(STRING); return E_STRING; {preamble} BEGIN(PREAMBLE); {entrytype} BEGIN(ENTRYTAG);(char *)yylval = strdup(yytext); return E_ENTRY_TYPE; [^{} \t\n,]+ BEGIN(ENTRY);(char *)yylval = strdup(yytext); return E_ENTRY_TAG; {attribute} (char *)yylval = strdup(yytext); return E_ATTR_NAME; {author} BEGIN(AUTHOR); return E_ATTR_AUTHOR; {url} BEGIN(URL); return E_ATTR_URL; [0-9a-zA-Z_-]+ (char *)yylval = strdup(yytext); return E_ATTR_UNKNOWN; "{" BEGIN(COMMENT_BODY); return E_LCUBR; [^}\n]* (char *)yylval = strdup(yytext); return E_TEXT_A; "}" BEGIN(INITIAL); return E_RCUBR; [^{} \t\n,=]+ (char *)yylval = strdup(yytext); return E_ENTRY_TAG; "{" BEGIN(PREAMBLE_BODY); [^}]* "}" BEGIN(INITIAL); "\"" BEGIN(URL_BODY); [^\n"]+ { if ((yytext[strlen(yytext)-1] == ';') || (yytext[strlen(yytext)-1] == ',')) { yytext[strlen(yytext)-1] = '\0'; } (char *)yylval = strdup(yytext); return E_TEXT_URL; } \n[ \t]* /* skip newlines in strings */ "\"" BEGIN(ENTRY); "\"" BEGIN(AUTHOR_BODY); {whitespace}+ /* skip */ [\n]+ /* skip */ {authorsep} return E_SEP_AUTHOR; ((\\\")|[^"\n ])+ (char *)yylval = strdup(yytext); return E_TEXT_A; "\"" BEGIN(ENTRY); [^\n"]* { buf = bibtex2ldif_strcat(buf, yytext); if (yytext[strlen(yytext)-1] == '\\') { BEGIN(STR_ESCAPE); } } "\"" { BEGIN(str_caller); (char *)yylval = strdup(buf); return E_TEXT_STRING; } \n[ \t]+ buf = bibtex2ldif_strcat(buf, " "); /* skip newlines in strings */ . buf = bibtex2ldif_strcat(buf, yytext); BEGIN(STR); <> return EOF; %% static char *bibtex2ldif_strcat(char *b, char *s) { if (s == NULL) { return NULL; } if (b == NULL) { b = (char *)malloc(strlen(s)+1); if (b == NULL) { return NULL; } strcpy(b, s); return b; } b = realloc(b, strlen(b)+strlen(s)+1); if (b == NULL) { return NULL; } strcat(b, s); return b; } static void bibtex2ldif_free(char *b) { if (b != NULL) { free((void *)b); } } void dummy(void) { if (0) { yyunput(0, NULL); } } #ifdef TEST_LEXER int yylval; int main(void) { while (1) { switch (yylex()) { case EOF: return 0; case E_START: fprintf(stderr, "E_START\n"); break; case E_LCUBR: fprintf(stderr, "E_LCUBR\n"); break; case E_RCUBR: fprintf(stderr, "E_RCUBR\n"); break; case E_ASSIGN: fprintf(stderr, "E_ASSIGN\n"); break; case E_SEP: fprintf(stderr, "E_SEP\n"); break; case E_SEP_AUTHOR: fprintf(stderr, "E_SEP_AUTHOR\n"); break; case E_ATTR_URL: fprintf(stderr, "E_ATTR_URL\n"); break; case E_ATTR_UNKNOWN: fprintf(stderr, "E_ATTR_UNKNOWN <%s>\n", yytext); break; case E_TEXT_A: fprintf(stderr, "E_TEXT_ANY <%s>\n", yytext); break; case E_TEXT_URL: fprintf(stderr, "E_TEXT_URL <%s>\n", yytext); break; case E_ENTRY_TYPE: fprintf(stderr, "E_ENTRY_TYPE <%s>\n", yytext); break; case E_ENTRY_TAG: fprintf(stderr, "E_ENTRY_TAG <%s>\n", yytext); break; case E_ATTR_NAME: fprintf(stderr, "E_ATTR_NAME <%s>\n", yytext); break; case E_ATTR_AUTHOR: fprintf(stderr, "E_ATTR_AUTHOR <%s>\n", yytext); break; case E_TEXT_STRING: fprintf(stderr, "E_TEXT_STRING <%s>\n", buf); bibtex2ldif_free(buf); buf = NULL; break; case E_COMMENT: fprintf(stderr, "E_COMMENT\n"); break; case E_STRING: fprintf(stderr, "E_STRING\n"); break; default: fprintf(stderr, "--> UNHANDLED TOKEN!!!!\n"); break; } } return 0; } int yywrap() { return 1; } #endif /* TEST_LEXER */