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

version 1.14, 2001/12/04 15:17:57 version 1.17, 2002/01/08 13:08:59
Line 150  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 427  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 476  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 529  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 538  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 698  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 800  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 827  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 842  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 875  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 */ }
 }  }
   

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


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