/* ---- This file is part of the PD system Copyright (C) 1998 Ralf Hartmut Gueting, Fachbereich Informatik, FernUniversitaet Hagen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ---- */ %option yylineno %option debug %{ #include "PDNestedText.h" extern int yylex(); %} /* regular definitions */ lbracket ("(*"|"/*") rbracket ("*)"|"*/") star [*] other [-;,?!`´'()/@#$%_\^{}+=|<>\n&üÜäÄöÖßµ¤] open {lbracket}{star}*(" "*[\n])+ open2 ([\n]" "*)*[\n]{lbracket}{star}*(" "*[\n])+ close {star}*{rbracket}(" "*[\n])+ epar [\n]" "*[\n](" "*[\n])* defline1 [\n]" "*"//" defline2 " "*"//" digit [0-9] num ({digit}{digit}|{digit}) ref "["{num}"]" verbatim "----" tt "__" head1 {num}" " head2 {num}"."{head1} head3 {num}"."{head2} head4 {num}"."{head3} head5 {num}"."{head4} enum1 " "{digit}" "|" "{digit}{digit}" " enum2 " "{enum1} bullet1 " * " bullet2 " "{bullet1} follow1 " " follow2 " "{follow1} display " " figure " " %x VERB %% ^{open} {return(OPEN);} {open2} {return(OPEN);} ^{close} {return(CLOSE);} ^{close}{open} { } ^{verbatim} { BEGIN(VERB); return(VERBATIM); } .|\n { const char* v1="\\verb!{!"; const char* v2="\\verb!}!"; const char* v3="\\verb!\\!"; switch (yytext[0]) { case '{' : { yylval = atom(v1,8); break; } case '}' : { yylval = atom(v2,8); break; } case '\\' : { yylval = atom(v3,8); break; } default : { yylval = atom(yytext, yyleng); } } return(VCHAR); } ^{verbatim} { BEGIN(INITIAL); return(ENDVERBATIM); } {epar} {yylval = atom(yytext, yyleng); return(EPAR);} {defline1} {yylval = atom(yytext, yyleng); return(DEFLINE);} ^{defline2} {yylval = atom(yytext, yyleng); return(DEFLINE);} [A-Za-z] {yylval = atom(yytext, yyleng); return(LETTER);} ^{head1} {yylval = atom(yytext, yyleng); return(HEAD1);} ^{head2} {yylval = atom(yytext, yyleng); return(HEAD2);} ^{head3} {yylval = atom(yytext, yyleng); return(HEAD3);} ^{head4} {yylval = atom(yytext, yyleng); return(HEAD4);} ^{head5} {yylval = atom(yytext, yyleng); return(HEAD5);} ^{enum1} {yylval = atom(yytext, yyleng); return(ENUM1);} ^{enum2} {yylval = atom(yytext, yyleng); return(ENUM2);} ^{bullet1} {yylval = atom(yytext, yyleng); return(BULLET1);} ^{bullet2} {yylval = atom(yytext, yyleng); return(BULLET2);} ^{follow1} {yylval = atom(yytext, yyleng); return(FOLLOW1);} ^{follow2} {yylval = atom(yytext, yyleng); return(FOLLOW2);} ^{display} {yylval = atom(yytext, yyleng); return(DISPLAY);} ^{figure} {yylval = atom(yytext, yyleng); return(FIGURE);} ^({ref}" "|"[] ") {yylval = atom(yytext, yyleng); return(STARTREF);} {ref} {yylval = atom(yytext, yyleng); return(REF);} [0-9] {yylval = atom(yytext, yyleng); return(DIGIT);} "[~]" {yylval = atom(yytext, yyleng); return(TILDE);} "[*]" {yylval = atom(yytext, yyleng); return(STAR);} "[__]" {yylval = atom(yytext, yyleng); return(DUS);} "[\"]" {yylval = atom(yytext, yyleng); return(QUOTE);} " ~ " {yylval = atom(yytext, yyleng); return(BLANKTILDE);} " * " {yylval = atom(yytext, yyleng); return(BLANKSTAR);} " __ " {yylval = atom(yytext, yyleng); return(BLANKDUS);} " \" " {yylval = atom(yytext, yyleng); return(BLANKQUOTE);} {other} {yylval = atom(yytext, yyleng); return(OTHER);} . {yylval = atom(yytext, yyleng); return(yytext[0]);} "paragraph" {yylval = atom(yytext, yyleng); return(PARFORMAT);} "characters" {yylval = atom(yytext, yyleng); return(CHARFORMAT);} {tt} {yylval = atom(yytext, yyleng); return(TTFORMAT);} %% /* "'" { yylval = atom(yytext, yyleng); return(OTHER);} 3.3 Testing the Lexical Analyser One can test lexical analysis separately from the rest of the system. The files ~PDTokens.h~ and ~PDLexTest.c~ are needed. The file ~PDTokens.h~ needs to be included in the ~declarations~ section of ~Lex.l~: ---- %{ #include "PDTokens.h" }% ---- This file just defines each token as an integer constant: */