diff options
Diffstat (limited to 'examples/manual/j2t.lex')
-rw-r--r-- | examples/manual/j2t.lex | 442 |
1 files changed, 442 insertions, 0 deletions
diff --git a/examples/manual/j2t.lex b/examples/manual/j2t.lex new file mode 100644 index 0000000..08fbd21 --- /dev/null +++ b/examples/manual/j2t.lex @@ -0,0 +1,442 @@ +/* + * j2t.lex : An example of the use (possibly abuse!) + * of start states. + */ + +%{ +#define MAX_STATES 1024 +#define TRUE 1 +#define FALSE 0 + +#define CHAPTER "@chapter" +#define SECTION "@section" +#define SSECTION "@subsection" +#define SSSECTION "@subsubsection" + +int states[MAX_STATES]; +int statep = 0; + +int need_closing = FALSE; + +char buffer[YY_BUF_SIZE]; + +extern char *yytext; + +/* + * set up the head of the *.texinfo file the program + * will produce. This is a standard texinfo header. + */ + +void print_header(void) +{ + printf("\\input texinfo @c -*-texinfo-*-\n"); + printf("@c %c**start of header\n",'%'); + printf("@setfilename jargon.info\n"); + printf("@settitle The New Hackers Dictionary\n"); + printf("@synindex fn cp\n"); + printf("@synindex vr cp\n"); + printf("@c %c**end of header\n",'%'); + printf("@setchapternewpage odd\n"); + printf("@finalout\n"); + printf("@c @smallbook\n"); + printf("\n"); + printf("@c ==========================================================\n\n"); + printf("@c This file was produced by j2t. Any mistakes are *not* the\n"); + printf("@c fault of the jargon file editors. \n"); + printf("@c ==========================================================\n\n"); + printf("@titlepage\n"); + printf("@title The New Hackers Dictionary\n"); + printf("@subtitle Version 2.9.10\n"); + printf("@subtitle Generated by j2t\n"); + printf("@author Eric S. Raymond, Guy L. Steel, Mark Crispin et al.\n"); + printf("@end titlepage\n"); + printf("@page\n"); + printf("\n@c ==========================================================\n"); + printf("\n\n"); + printf("@unnumbered Preface\n"); + printf("@c *******\n"); +} + +/* + * create the tail of the texinfo file produced. + */ + +void print_trailer(void) +{ + printf("\n@c ==========================================================\n"); + printf("@contents\n"); /* print the table of contents */ + printf("@bye\n\n"); +} + +/* + * write an underline under a section + * or chapter so we can find it later. + */ + +void write_underline(int len, int space, char ch) +{ + int loop; + + printf("@c "); + + for(loop=3; loop<space; loop++){ + printf(" "); + } + + while(len--){ + printf("%c",ch); + } + printf("\n\n"); +} + +/* + * check for texinfo special characters + * and escape them + */ + +char *check_and_convert(char *string) +{ + int buffpos = 0; + int len,loop; + + len = strlen(string); + for(loop=0; loop<len; loop++){ + if(string[loop] == '@' || string[loop] == '{' || string[loop] == '}'){ + buffer[buffpos++] = '@'; + buffer[buffpos++] = string[loop]; + } else { + buffer[buffpos++] = string[loop]; + } + } + buffer[buffpos] = '\0'; + return(buffer); +} + +/* + * write out a chapter,section, or subsection + * header + */ + +void write_block_header(char *type) +{ + int loop; + int len; + + (void)check_and_convert(yytext); + len = strlen(buffer); + for(loop=0; buffer[loop] != '\n';loop++) + ; + buffer[loop] = '\0'; + printf("%s %s\n",type,buffer); + write_underline(strlen(buffer),strlen(type)+1,'*'); +} + +%} + +/* + * the flex description starts here + */ + +%x HEADING EXAMPLE ENUM EXAMPLE2 +%x BITEM BITEM_ITEM +%s LITEM LITEM2 + +%% + +^#[^#]*"#" /* skip the header & trailer */ + /* chapters have asterisks under them + * and are terminated by a colon + */ +^[^\n:]+\n[*]+\n write_block_header(CHAPTER); + +^"= "[A-Z]" ="\n"="* { /* we create a seciton for each category */ + if(need_closing == TRUE){ + printf("@end table\n\n\n"); + } + need_closing = TRUE; + write_block_header(SECTION); + printf("\n\n@table @b\n"); + } + +"Examples:"[^\.]+ ECHO; + +"*"[^*\n]+"*" { /* @emph{}(emphasized) text */ + yytext[yyleng-1] = '\0'; + (void)check_and_convert(&yytext[1]); + printf("@i{%s}",buffer); + } + +"{{"[^}]+"}}" { /* special emphasis */ + yytext[yyleng-2] = '\0'; + (void)check_and_convert(&yytext[2]); + printf("@b{%s}",buffer); + } + +"{"[^}]+"}" { /* special emphasis */ + yytext[yyleng-1] = '\0'; + (void)check_and_convert(&yytext[1]); + printf("@b{%s}",buffer); + } + + /* escape some special texinfo characters */ +<INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"@" printf("@@"); +<INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"{" printf("@{"); +<INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"}" printf("@}"); + + /* + * reproduce @example code + */ + +":"\n+[^\n0-9*]+\n" "[^ ] { + int loop; + int len; + int cnt; + + printf(":\n\n@example \n"); + strcpy(buffer,yytext); + len = strlen(buffer); + cnt = 0; + for(loop=len; loop > 0;loop--){ + if(buffer[loop] == '\n') + cnt++; + if(cnt == 2) + break; + } + yyless(loop+1); + statep++; + states[statep] = EXAMPLE2; + BEGIN(EXAMPLE2); + } +<EXAMPLE,EXAMPLE2>^\n { + printf("@end example\n\n"); + statep--; + BEGIN(states[statep]); + } + + /* + * repoduce @enumerate lists + */ + +":"\n+[ \t]*[0-9]+"." { + int loop; + int len; + + printf(":\n\n@enumerate \n"); + strcpy(buffer,yytext); + len = strlen(buffer); + for(loop=len; loop > 0;loop--){ + if(buffer[loop] == '\n') + break; + } + yyless(loop); + statep++; + states[statep] = ENUM; + BEGIN(ENUM); + } + +<ENUM>"@" printf("@@"); +<ENUM>":"\n+" "[^0-9] { + printf(":\n\n@example\n"); + statep++; + states[statep] = EXAMPLE; + BEGIN(EXAMPLE); + } + + +<ENUM>\n[ \t]+[0-9]+"." { + printf("\n\n@item "); + } +<ENUM>^[^ ] | +<ENUM>\n\n\n[ \t]+[^0-9] { + printf("\n\n@end enumerate\n\n"); + statep--; + BEGIN(states[statep]); + } + + /* + * reproduce one kind of @itemize list + */ + +":"\n+":" { + int loop; + int len; + + printf(":\n\n@itemize @bullet \n"); + yyless(2); + statep++; + states[statep] = LITEM2; + BEGIN(LITEM2); + } +<LITEM2>^":".+":" { + (void)check_and_convert(&yytext[1]); + buffer[strlen(buffer)-1]='\0'; + printf("@item @b{%s:}\n",buffer); + } + +<LITEM2>\n\n\n+[^:\n] { + printf("\n\n@end itemize\n\n"); + ECHO; + statep--; + BEGIN(states[statep]); + } + + /* + * create a list out of the revision history part. + * We need the "Version" for this because it + * clashes with other rules otherwise. + */ + +:[\n]+"Version"[^:\n*]+":" { + int loop; + int len; + + printf(":\n\n@itemize @bullet \n"); + strcpy(buffer,yytext); + len = strlen(buffer); + for(loop=len; loop > 0;loop--){ + if(buffer[loop] == '\n') + break; + } + yyless(loop); + statep++; + states[statep] = LITEM; + BEGIN(LITEM); + } +<LITEM>^.+":" { + (void)check_and_convert(yytext); + buffer[strlen(buffer)-1]='\0'; + printf("@item @b{%s}\n\n",buffer); + } + +<LITEM>^[^:\n]+\n\n[^:\n]+\n { + int loop; + + strcpy(buffer,yytext); + for(loop=0; buffer[loop] != '\n'; loop++); + buffer[loop] = '\0'; + printf("%s\n",buffer); + printf("@end itemize\n\n"); + printf("%s",&buffer[loop+1]); + statep--; + BEGIN(states[statep]); + } + + /* + * reproduce @itemize @bullet lists + */ + +":"\n[ ]*"*" { + int loop; + int len; + + printf(":\n\n@itemize @bullet \n"); + len = strlen(buffer); + for(loop=0; loop < len;loop++){ + if(buffer[loop] == '\n') + break; + } + yyless((len-loop)+2); + statep++; + states[statep] = BITEM; + BEGIN(BITEM); + } + +<BITEM>^" "*"*" { + printf("@item"); + statep++; + states[statep] = BITEM_ITEM; + BEGIN(BITEM_ITEM); + } +<BITEM>"@" printf("@@"); +<BITEM>^\n { + printf("@end itemize\n\n"); + statep--; + BEGIN(states[statep]); + } +<BITEM_ITEM>[^\:]* { + printf(" @b{%s}\n\n",check_and_convert(yytext)); + } +<BITEM_ITEM>":" { + statep--; + BEGIN(states[statep]); + } + + /* + * recreate @chapter, @section etc. + */ + +^:[^:]* { + (void)check_and_convert(&yytext[1]); + statep++; + states[statep] = HEADING; + BEGIN(HEADING); + } +<HEADING>:[^\n] { + printf("@item @b{%s}\n",buffer); + write_underline(strlen(buffer),6,'~'); + statep--; + BEGIN(states[statep]); + } +<HEADING>:\n"*"* { + if(need_closing == TRUE){ + printf("@end table\n\n\n"); + need_closing = FALSE; + } + printf("@chapter %s\n",buffer); + write_underline(strlen(buffer),9,'*'); + statep--; + BEGIN(states[statep]); + } +<HEADING>:\n"="* { + if(need_closing == TRUE){ + printf("@end table\n\n\n"); + need_closing = FALSE; + } + printf("@section %s\n",buffer); + write_underline(strlen(buffer),9,'='); + statep--; + BEGIN(states[statep]); + } +<HEADING>"@" printf("@@"); +<HEADING>:\n"-"* { + if(need_closing == TRUE){ + printf("@end table\n\n\n"); + need_closing = FALSE; + } + printf("@subsection %s\n",buffer); + write_underline(strlen(buffer),12,'-'); + statep--; + BEGIN(states[statep]); + } + + /* + * recreate @example text + */ + +^" " { + printf("@example\n"); + statep++; + states[statep] = EXAMPLE; + BEGIN(EXAMPLE); + } +<EXAMPLE>^" " +. ECHO; + +%% + +/* + * initialise and go. + */ + +int main(int argc, char *argv[]) +{ + states[0] = INITIAL; + statep = 0; + print_header(); + yylex(); + print_trailer(); + return(0); +} + + + |