Diff for /loncom/homework/CAPA-converter/capaLexerDef.flex between versions 1.10 and 1.17

version 1.10, 2001/11/18 09:49:43 version 1.17, 2002/01/08 13:08:59
Line 1 Line 1
   /* The LearningOnline Network with CAPA
    * CAPA lexer dfinition, heavily modified to become a LON-CAPA convertor 
    * $Id$
    *
    * Copyright Michigan State University Board of Trustees
    *
    * This file is part of the LearningOnline Network with CAPA (LON-CAPA).
    *
    * LON-CAPA 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.
    *
    * LON-CAPA 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.
    *
    * You should have received a copy of the GNU General Public License
    * along with LON-CAPA; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    *
    * /home/httpd/html/adm/gpl.txt
    *
    * http://www.lon-capa.org/
    */
   
 /*------------------------------------------------------------------------*/  /*------------------------------------------------------------------------*/
 /*         capaLexerDef.flex   created by Isaac Tsai Jul 15 1996          */  /*         capaLexerDef.flex   created by Isaac Tsai Jul 15 1996          */
 /*                             added /END(variable)                       */  /*                             added /END(variable)                       */
Line 123  int           IFcount; Line 150  int           IFcount;
 WhileLoop_t   WhileStack[MAX_FUNC_NEST];   /* <-- perhaps we can use linked list */  WhileLoop_t   WhileStack[MAX_FUNC_NEST];   /* <-- perhaps we can use linked list */
 int           While_idx, Wcount;  int           While_idx, Wcount;
 int           sccount;           /* Semi-colon count for MAP and RMAP  */  int           sccount;           /* Semi-colon count for MAP and RMAP  */
   int           HINTflag=0;
   int           EXPflag=0;
   
 #ifdef  USE_DYNAMIC_SYMBOLS  #ifdef  USE_DYNAMIC_SYMBOLS
 Symbol       *SymbList_p;  Symbol       *SymbList_p;
Line 400  EndLine    ([\r][\n]|[\n]) Line 429  EndLine    ([\r][\n]|[\n])
    send("<PRE>\n");     send("<PRE>\n");
                                  }                                   }
 ^{Spaces}"/HIN"{Alpha}*{Spaces}  { LLDBUG_PRL1("[HIN]");   ^{Spaces}"/HIN"{Alpha}*{Spaces}  { LLDBUG_PRL1("[HIN]"); 
                                    start_mode(MODE_HINT, "");                                 /*    start_mode(MODE_HINT, "");*/
                                      if (!HINTflag) {
                                        start_streams(HINT_DEST,1);
                                        HINTflag=-1;
                                      }
                                      change_destination(HINT_DEST);
    BEGIN S_HINT;      BEGIN S_HINT; 
                                  }                                   }
 ^{Spaces}"/EXP"{Alpha}*{Spaces}  { start_mode(MODE_BLOCK,"condition=&explanation");  ^{Spaces}"/EXP"{Alpha}*{Spaces}  { 
                                      if (!EXPflag) {
                                        start_streams(EXP_DEST,1);
                                        EXPflag=-1;
                                      }
                                      change_destination(EXP_DEST);
                                    LLDBUG_PRL1("[EXP]"); Current_char_p = String_buf;  BEGIN S_EXPLAIN; }                                     LLDBUG_PRL1("[EXP]"); Current_char_p = String_buf;  BEGIN S_EXPLAIN; }
 ^{Spaces}"/IMP"{Alpha}*{Space}+  { LLDBUG_PRL1("[IMP]"); BEGIN S_IMPORT; end_mode(); }  ^{Spaces}"/IMP"{Alpha}*{Space}+  { LLDBUG_PRL1("[IMP]"); BEGIN S_IMPORT; end_mode(); }
 ^{Spaces}"/END"                  { LLDBUG_PRL1("[END]");    ^{Spaces}"/END"                  { LLDBUG_PRL1("[END]");  
Line 449  EndLine    ([\r][\n]|[\n]) Line 488  EndLine    ([\r][\n]|[\n])
                               }                                }
 ^{Spaces}"/MAP"               { LLDBUG_PRL1("[MAP]");  Pcount = 0; sccount = 0; BEGIN S_MAP; start_mode(MODE_SCRIPT,NULL);send("&map("); }  ^{Spaces}"/MAP"               { LLDBUG_PRL1("[MAP]");  Pcount = 0; sccount = 0; BEGIN S_MAP; start_mode(MODE_SCRIPT,NULL);send("&map("); }
 ^{Spaces}"/RMAP"              { LLDBUG_PRL1("[RMAP]"); Pcount = 0; sccount = 0; BEGIN S_MAP; start_mode(MODE_SCRIPT,NULL);send("&rmap("); }  ^{Spaces}"/RMAP"              { LLDBUG_PRL1("[RMAP]"); Pcount = 0; sccount = 0; BEGIN S_MAP; start_mode(MODE_SCRIPT,NULL);send("&rmap("); }
 ^{Spaces}"/ENDWHILE"([^\n])*          { long int  file_pos;         ^{Spaces}"/ENDWHILE"([^\n])*          { 
                                 int   top_item, input_idx;                                  int i;
                                 LLDBUG_PRL2("[ENDWHILE While_idx=<%d>]\n",While_idx);                                  LLDBUG_PRL2("[ENDWHILE While_idx=<%d>]\n",IFcount);
                                                                   IFcount--;
                                 top_item = While_idx - 1;   end_mode_stream(DEFAULT_DEST,0);
                                 if( top_item < 0 ) { /* strange things must have happened here! */   for(i=0;i<IFcount;i++) {send("\t",NULL);}
                                      send_stream(0,"</while>");
                                 } else {   send_stream(1,"}");
                                   input_idx = WhileStack[top_item].input_idx;   if (IFcount == 0) {
                                   file_pos = WhileStack[top_item].pos_idx;    if (watch_mode[current_dest][1]) {
                                   Current_line[input_idx] = WhileStack[top_item].line_idx;      end_streams(DEFAULT_DEST,1);
                                   Lexi_pos[input_idx] = 0;     } else {
                                   fseek(Input_stream[input_idx],file_pos,SEEK_SET);      end_streams(DEFAULT_DEST,0);
                                   fgets(Lexi_buf[input_idx],LEX_BUFLEN-1,Input_stream[input_idx]);    }
                                   While_idx--;                                    change_destination(DEFAULT_DEST);
                                 }   }
    delete_cache();
                                 BEGIN S_TEXT;                                  BEGIN S_TEXT;
                               }                                }
 "/WHILE"                      |  "/WHILE"                      |
 ^{Spaces}"/WHILE"             { long int file_pos;  ^{Spaces}"/WHILE"             { 
                                 int      leng;                                  int      i;
                                 LLDBUG_PRL2("[WHILE While_idx=<%d>]\n",While_idx);                                  LLDBUG_PRL2("[WHILE While_idx=<%d>]\n",IFcount);
                                 leng = strlen(Lexi_buf[Input_idx]);  /* length of current line */                                  IFcount++;  /* advance the stack pointer */
                                 /* <-- because we use fgets() to read input,                                   BEGIN S_TRUE_FALSE_STMT;
                                        thus ftell() will give the starting position of next line */   if ( IFcount == 1) {
                                 WhileStack[While_idx].input_idx = Input_idx;     start_streams(DEFAULT_DEST, 2);
                                 file_pos = ftell(Input_stream[Input_idx]);                                    change_destination(DEFAULT_DEST);
                                 file_pos -= leng;  /* calibrate the current line length */    watch_mode[current_dest][1]=1;
                                 WhileStack[While_idx].pos_idx = file_pos;  /* begin of current line */   }
                                 WhileStack[While_idx].line_idx = Current_line[Input_idx];   end_mode_stream(DEFAULT_DEST, 0);
                                 While_idx++;  /* advance the stack pointer */   start_mode_stream(DEFAULT_DEST,1,MODE_SCRIPT,NULL);
                                    for(i=1;i<IFcount;i++) {send("\t",NULL);}
                                 BEGIN S_TRUE_FALSE_STMT; RETURN(CAPA_WHILE);    send_stream(0,"<while condition=\"",NULL);
                                    send_stream(1,"while (",NULL);
    new_cache();
    start_cache();
                               }                                }
 ^{Spaces}"/IF"                { int i;  ^{Spaces}"/IF"                { int i;
  IFcount++;   IFcount++;
                                 LLDBUG_PRL2("[IF <IFcount=%d>]",IFcount);                                  LLDBUG_PRL2("[IF <IFcount=%d>]",IFcount);
  BEGIN S_TRUE_FALSE_STMT;   BEGIN S_TRUE_FALSE_STMT;
  if ( IFcount == 1) {   if ( IFcount == 1) {
    start_streams(2);     start_streams(DEFAULT_DEST, 2);
   watch_mode[1]=1;                                    change_destination(DEFAULT_DEST);
     watch_mode[current_dest][1]=1;
  }   }
  end_mode_stream(0);   end_mode_stream(DEFAULT_DEST, 0);
  start_mode_stream(1,MODE_SCRIPT,NULL);   start_mode_stream(DEFAULT_DEST,1,MODE_SCRIPT,NULL);
  for(i=1;i<IFcount;i++) {send("\t",NULL);}   for(i=1;i<IFcount;i++) {send("\t",NULL);}
  send_stream(0,"<block condition=\"",NULL);   send_stream(0,"<block condition=\"",NULL);
  send_stream(1,"if (",NULL);   send_stream(1,"if (",NULL);
Line 502  EndLine    ([\r][\n]|[\n]) Line 545  EndLine    ([\r][\n]|[\n])
        }         }
 ^{Spaces}"/ELSE"([^\n])*      { int i;  ^{Spaces}"/ELSE"([^\n])*      { int i;
  LLDBUG_PRL2("[ELSE <IFcount=%d>]\n",IFcount);   LLDBUG_PRL2("[ELSE <IFcount=%d>]\n",IFcount);
  end_mode_stream(0);   end_mode_stream(DEFAULT_DEST,0);
  for(i=1;i<IFcount;i++) {send("\t",NULL);}   for(i=1;i<IFcount;i++) {send("\t",NULL);}
   send_stream(0,    send_stream(0,
                                       "</block>\n<block condition=\"!(%s)\">",                                        "</block>\n<block condition=\"!(%s)\">",
Line 511  EndLine    ([\r][\n]|[\n]) Line 554  EndLine    ([\r][\n]|[\n])
                               }                                }
 ^{Spaces}"/ENDIF"([^\n])*     { int i;  ^{Spaces}"/ENDIF"([^\n])*     { int i;
  IFcount--;   IFcount--;
  end_mode_stream(0);   end_mode_stream(DEFAULT_DEST,0);
  for(i=0;i<IFcount;i++) {send("\t",NULL);}   for(i=0;i<IFcount;i++) {send("\t",NULL);}
  send_stream(0,"</block>");   send_stream(0,"</block>");
  send_stream(1,"}");   send_stream(1,"}");
  if (IFcount == 0) {   if (IFcount == 0) {
   if (watch_mode[1]) {    if (watch_mode[current_dest][1]) {
     end_streams(1);      end_streams(DEFAULT_DEST,1);
    } else {     } else {
     end_streams(0);      end_streams(DEFAULT_DEST,0);
   }    }
                                     change_destination(DEFAULT_DEST);
  }   }
  delete_cache();   delete_cache();
  LLDBUG_PRL2("[ENDIF <IFcount=%d>]\n",IFcount);    LLDBUG_PRL2("[ENDIF <IFcount=%d>]\n",IFcount); 
Line 671  EndLine    ([\r][\n]|[\n]) Line 715  EndLine    ([\r][\n]|[\n])
 <S_HINT>{  <S_HINT>{
 {EndLine}                     {  LLDBUG_PR1("[CR hint]");  {EndLine}                     {  LLDBUG_PR1("[CR hint]");
                                  send("\n");                                    send("\n"); 
                                    change_destination(DEFAULT_DEST);
                                  BEGIN S_TEXT;                                   BEGIN S_TEXT;
                               }                                }
 }  }
 <S_EXPLAIN>{  <S_EXPLAIN>{
 {EndLine}                     {  LLDBUG_PR1("[CR explain]");  {EndLine}                     {  LLDBUG_PR1("[CR explain]");
                                  send("\n");                                    send("\n"); 
                                    change_destination(DEFAULT_DEST);
                                  BEGIN S_TEXT;                                   BEGIN S_TEXT;
                               }                                }
 }  }
Line 688  EndLine    ([\r][\n]|[\n]) Line 734  EndLine    ([\r][\n]|[\n])
 }  }
   
 <S_IMPORT>{  <S_IMPORT>{
 {FileName}{Space}*             {  {FileName}{Space}*             { char *endquote;
                                  end_mode();                                   end_mode();
  start_mode(MODE_IMPORT,NULL);   start_mode(MODE_IMPORT,NULL);
                                  send("%s/%s",import_prefix,yytext);   /* Get rid of leading and trailing quotes */
          end_mode();   endquote = strrchr(yytext,'\"');
                                  BEGIN S_SKIP;                                    *endquote = '\0';
                                    if (yytext[1] == '/') {
                                       send("%s%s",import_prefix,&yytext[1]);
                                    } else {
                                       send("%s",&yytext[1]);
                                    }
    end_mode();
    BEGIN S_SKIP;
                                }                                 }
 {Identifier}{Space}*           { end_mode();  {Identifier}{Space}*           { end_mode();
  start_mode(MODE_IMPORT,NULL);   start_mode(MODE_IMPORT,NULL);
  send("$%s",yytext);   send("$%s",yytext);
  end_mode();   end_mode();
  BEGIN S_SKIP;                                   BEGIN S_SKIP;
        }         }
 }  }
   
Line 766  EndLine    ([\r][\n]|[\n]) Line 819  EndLine    ([\r][\n]|[\n])
                                dosend=2;                                 dosend=2;
                              }                               }
   
 [Ss][Tt][Rr]                 { LLDBUG_PR1("[STR]"); send("\" str=\""); dosend=1; }  [Ss][Tt][Rr]                 { LLDBUG_PR1("[STR]"); send("\" type=\""); dosend=1; }
 [Ee][Vv][Aa][Ll]             |  [Ee][Vv][Aa][Ll]             |
 [Ee][Vv][Aa][Ll][Uu][Aa][Tt][Ee] { LLDBUG_PR1("[EVAL]");send("\" eval="); dosend=1;}  [Ee][Vv][Aa][Ll][Uu][Aa][Tt][Ee] { LLDBUG_PR1("[EVAL]");send("\" eval="); dosend=1;}
 [Uu][Nn][Ii][Tt]             |  [Uu][Nn][Ii][Tt]             |
 [Uu][Nn][Ii][Tt][Ss]         { LLDBUG_PR1("[UNIT]"); send("\" units=\""); dosend=1;}  [Uu][Nn][Ii][Tt][Ss]         { LLDBUG_PR1("[UNIT]"); send("\" unit=\""); dosend=1;}
   
 [Ee][Xx][Tt][Ee][Rr][Nn][Aa][Ll]  { LLDBUG_PR1("[EXTERNAL]"); dosend=0; }  [Ee][Xx][Tt][Ee][Rr][Nn][Aa][Ll]  { LLDBUG_PR1("[EXTERNAL]"); dosend=0; }
 [Aa][Nn][Ss][Bb][Oo][Xx]     { LLDBUG_PR1("[SHOW_ANS_BOX]"); dosend=0; }  [Aa][Nn][Ss][Bb][Oo][Xx]     { LLDBUG_PR1("[SHOW_ANS_BOX]"); dosend=0; }
Line 793  EndLine    ([\r][\n]|[\n]) Line 846  EndLine    ([\r][\n]|[\n])
        dosend=1;         dosend=1;
        flush_delayed();         flush_delayed();
        if (firstparam!=1) send("\" />\n");         if (firstparam!=1) send("\" />\n");
        send("\t<textline />\n</numericalresponse>\n");         send("\t<textline />\n");
                            /* Fill in Hints */ 
          if ( !is_dest_empty(HINT_DEST) ) {
            send("<hintgroup>\n\t<hintpart on=\"default\">\n\t<startouttext />");
                                    end_streams(HINT_DEST,0);
                                    HINTflag=0;
                                    send("\t<endouttext />\n\t</hintpart>\n</hintgroup>\n");
          }
          send("\n</numericalresponse>\n");
   
          if ( !is_dest_empty(EXP_DEST) ) {
            send("<postanswerdate>\n\t<startouttext />\n");
                                    end_streams(EXP_DEST,0);
                                    EXPflag=0;
                                    send("\t<endouttext />\n</postanswerdate>\n");
                                  }
                              }                               }
 }  }
   
Line 808  EndLine    ([\r][\n]|[\n]) Line 876  EndLine    ([\r][\n]|[\n])
                                  if (dosend==2) add_delayed("&%s",yytext);                                   if (dosend==2) add_delayed("&%s",yytext);
  Pcount++;   Pcount++;
                                }                                 }
 {Alpha}{AlphaNum}*{Space}*[\[]  {  char aline[MAX_FUNC_NAME];  {Alpha}{AlphaNum}*{Space}*[\[]  {
                                    int  i;                                        LLDBUG_PR2("[ARRAY<%s>]",yytext);
                                    for(i=0;i < (yyleng-1); i++) {  
                                      if( yytext[i] == ' ' || yytext[i] == '\t' ||   
                                          yytext[i] == 0   || yytext[i] == '[' )    break;  
                                      aline[i] = yytext[i];  
                                    }  
                                    aline[i] = 0;  
                                    LLDBUG_PR2("[ARRAY<%s>]",aline);  
                                                                         
                                    yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */                                     yyless(yyleng-1); /*<-- push back char '[' */
                                    yylval->s_name = strsave(aline); /* free it in parser() */                                     if (dosend==1) send("$%s",yytext); 
                                    yylval->s_type = ARRAY_ID;                                     if (dosend==2) add_delayed("$%s",yytext); 
                                      
                                    yyless(yyleng-1); /* <-- push back char '[' */  
                                    RETURN(ARRAY_ID);  
                                }                                 }
 {Number}*"\."{Number}*[Ee]"+"{Number}+ |  {Number}*"\."{Number}*[Ee]"+"{Number}+ |
 {Number}*"\."{Number}*[Ee]{Number}+    |  {Number}*"\."{Number}*[Ee]{Number}+    |
Line 841  EndLine    ([\r][\n]|[\n]) Line 899  EndLine    ([\r][\n]|[\n])
                              if (dosend==1) send("%s",yytext);                               if (dosend==1) send("%s",yytext);
                              if (dosend==2) add_delayed("%s",yytext);                               if (dosend==2) add_delayed("%s",yytext);
   }    }
 [\[]                      { LLDBUG_PR1("[dis let ans map '[']");         return(yytext[0]); }  [\[]                      { LLDBUG_PR1("[dis let ans map '[']");
 [\]]                      { LLDBUG_PR1("[dis let ans map ']']");         return(yytext[0]); }      if(dosend==1) send("%s",yytext);
       if(dosend==2) add_delayed("%s",yytext);
     }
   [\]]                      { LLDBUG_PR1("[dis let ans map ']']");
       if(dosend==1) send("%s",yytext);
       if(dosend==2) add_delayed("%s",yytext);
     }
 {Space}+                  { /* LLDBUG_PR1("[SP ignored]");  Ignore Spaces */ }  {Space}+                  { /* LLDBUG_PR1("[SP ignored]");  Ignore Spaces */ }
 }  }
   
Line 930  EndLine    ([\r][\n]|[\n]) Line 994  EndLine    ([\r][\n]|[\n])
  BEGIN S_ECHO;   BEGIN S_ECHO;
                       }                        }
                     }                      }
   [%]                 {send("%%");}
 {Operator}          { LLDBUG_PR2("[Op(%c) in VAR,TF_STMT,LET]",yytext[0]); send(yytext); }  {Operator}          { LLDBUG_PR2("[Op(%c) in VAR,TF_STMT,LET]",yytext[0]); send(yytext); }
 }  }
   
Line 988  EndLine    ([\r][\n]|[\n]) Line 1053  EndLine    ([\r][\n]|[\n])
                       send("'");                        send("'");
       yy_pop_state();        yy_pop_state();
     }      }
   [%]                 { /*Escape percent signs so that vasprintf doesn't choke */
                         send("%%");
                       }
 {EndLine}           { /* check for termination of string constant */  {EndLine}           { /* check for termination of string constant */
                       char warn_msg[WARN_MSG_LENGTH];                        char warn_msg[WARN_MSG_LENGTH];
                                               

Removed from v.1.10  
changed lines
  Added in v.1.17


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>