⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 j2t.lex

📁 flex
💻 LEX
字号:
/* * 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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -