--- loncom/homework/CAPA-converter/capaLexerDef.flex 2001/11/18 09:49:43 1.10 +++ loncom/homework/CAPA-converter/capaLexerDef.flex 2002/01/08 13:08:59 1.17 @@ -1,3 +1,30 @@ +/* The LearningOnline Network with CAPA + * CAPA lexer dfinition, heavily modified to become a LON-CAPA convertor + * $Id: capaLexerDef.flex,v 1.17 2002/01/08 13:08:59 albertel Exp $ + * + * 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 */ /* added /END(variable) */ @@ -123,6 +150,8 @@ int IFcount; WhileLoop_t WhileStack[MAX_FUNC_NEST]; /* <-- perhaps we can use linked list */ int While_idx, Wcount; int sccount; /* Semi-colon count for MAP and RMAP */ +int HINTflag=0; +int EXPflag=0; #ifdef USE_DYNAMIC_SYMBOLS Symbol *SymbList_p; @@ -400,10 +429,20 @@ EndLine ([\r][\n]|[\n]) send("
\n");
                                  }
 ^{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; 
                                  }
-^{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; }
 ^{Spaces}"/IMP"{Alpha}*{Space}+  { LLDBUG_PRL1("[IMP]"); BEGIN S_IMPORT; end_mode(); }
 ^{Spaces}"/END"                  { LLDBUG_PRL1("[END]");  
@@ -449,51 +488,55 @@ EndLine    ([\r][\n]|[\n])
                               }
 ^{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}"/ENDWHILE"([^\n])*          { long int  file_pos;       
-                                int   top_item, input_idx;
-                                LLDBUG_PRL2("[ENDWHILE While_idx=<%d>]\n",While_idx);
-                                
-                                top_item = While_idx - 1;
-                                if( top_item < 0 ) { /* strange things must have happened here! */
-                                  
-                                } else {
-                                  input_idx = WhileStack[top_item].input_idx;
-                                  file_pos = WhileStack[top_item].pos_idx;
-                                  Current_line[input_idx] = WhileStack[top_item].line_idx;
-                                  Lexi_pos[input_idx] = 0;
-                                  fseek(Input_stream[input_idx],file_pos,SEEK_SET);
-                                  fgets(Lexi_buf[input_idx],LEX_BUFLEN-1,Input_stream[input_idx]);
-                                  While_idx--;
-                                }
+^{Spaces}"/ENDWHILE"([^\n])*          { 
+                                int i;
+                                LLDBUG_PRL2("[ENDWHILE While_idx=<%d>]\n",IFcount);
+                                IFcount--;
+				end_mode_stream(DEFAULT_DEST,0);
+				for(i=0;i");
+				send_stream(1,"}");
+				if (IFcount == 0) {
+				  if (watch_mode[current_dest][1]) {
+				    end_streams(DEFAULT_DEST,1);
+ 				  } else {
+				    end_streams(DEFAULT_DEST,0);
+				  }
+                                  change_destination(DEFAULT_DEST);
+				}
+				delete_cache();
                                 BEGIN S_TEXT;
                               }
 "/WHILE"                      |
-^{Spaces}"/WHILE"             { long int file_pos;
-                                int      leng;
-                                LLDBUG_PRL2("[WHILE While_idx=<%d>]\n",While_idx);
-                                leng = strlen(Lexi_buf[Input_idx]);  /* length of current line */
-                                /* <-- because we use fgets() to read input, 
-                                       thus ftell() will give the starting position of next line */
-                                WhileStack[While_idx].input_idx = Input_idx;
-                                file_pos = ftell(Input_stream[Input_idx]);
-                                file_pos -= leng;  /* calibrate the current line length */
-                                WhileStack[While_idx].pos_idx = file_pos;  /* begin of current line */
-                                WhileStack[While_idx].line_idx = Current_line[Input_idx];
-                                While_idx++;  /* advance the stack pointer */
-                                
-                                BEGIN S_TRUE_FALSE_STMT; RETURN(CAPA_WHILE); 
-                                
+^{Spaces}"/WHILE"             { 
+                                int      i;
+                                LLDBUG_PRL2("[WHILE While_idx=<%d>]\n",IFcount);
+                                IFcount++;  /* advance the stack pointer */
+                                BEGIN S_TRUE_FALSE_STMT;
+				if ( IFcount == 1) {
+ 				  start_streams(DEFAULT_DEST, 2);
+                                  change_destination(DEFAULT_DEST);
+				  watch_mode[current_dest][1]=1;
+				}
+				end_mode_stream(DEFAULT_DEST, 0);
+				start_mode_stream(DEFAULT_DEST,1,MODE_SCRIPT,NULL);
+				for(i=1;i]",IFcount);
 				BEGIN S_TRUE_FALSE_STMT;
 				if ( IFcount == 1) {
- 				  start_streams(2);
-				  watch_mode[1]=1;
+ 				  start_streams(DEFAULT_DEST, 2);
+                                  change_destination(DEFAULT_DEST);
+				  watch_mode[current_dest][1]=1;
 				}
-				end_mode_stream(0);
-				start_mode_stream(1,MODE_SCRIPT,NULL);
+				end_mode_stream(DEFAULT_DEST, 0);
+				start_mode_stream(DEFAULT_DEST,1,MODE_SCRIPT,NULL);
 				for(i=1;i]\n",IFcount);
-				end_mode_stream(0);
+				end_mode_stream(DEFAULT_DEST,0);
 				for(i=1;i\n",
@@ -511,16 +554,17 @@ EndLine    ([\r][\n]|[\n])
                               }
 ^{Spaces}"/ENDIF"([^\n])*     { int i;
 				IFcount--;
-				end_mode_stream(0);
+				end_mode_stream(DEFAULT_DEST,0);
 				for(i=0;i");
 				send_stream(1,"}");
 				if (IFcount == 0) {
-				  if (watch_mode[1]) {
-				    end_streams(1);
+				  if (watch_mode[current_dest][1]) {
+				    end_streams(DEFAULT_DEST,1);
  				  } else {
-				    end_streams(0);
+				    end_streams(DEFAULT_DEST,0);
 				  }
+                                  change_destination(DEFAULT_DEST);
 				}
 				delete_cache();
 				LLDBUG_PRL2("[ENDIF ]\n",IFcount); 
@@ -671,12 +715,14 @@ EndLine    ([\r][\n]|[\n])
 {
 {EndLine}                     {  LLDBUG_PR1("[CR hint]");
                                  send("\n"); 
+                                 change_destination(DEFAULT_DEST);
                                  BEGIN S_TEXT;
                               }
 }
 {
 {EndLine}                     {  LLDBUG_PR1("[CR explain]");
                                  send("\n"); 
+                                 change_destination(DEFAULT_DEST);
                                  BEGIN S_TEXT;
                               }
 }
@@ -688,18 +734,25 @@ EndLine    ([\r][\n]|[\n])
 }
 
 {
-{FileName}{Space}*             {
+{FileName}{Space}*             { char *endquote;
                                  end_mode();
 				 start_mode(MODE_IMPORT,NULL);
-                                 send("%s/%s",import_prefix,yytext);
-			         end_mode();
-                                 BEGIN S_SKIP; 
+				 /* Get rid of leading and trailing quotes */
+				 endquote = strrchr(yytext,'\"');
+                                 *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();
 				 start_mode(MODE_IMPORT,NULL);
 				 send("$%s",yytext);
 				 end_mode();
-				 BEGIN S_SKIP;
+                                 BEGIN S_SKIP;
 			       }
 }
 
@@ -766,11 +819,11 @@ EndLine    ([\r][\n]|[\n])
                                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][Uu][Aa][Tt][Ee] { LLDBUG_PR1("[EVAL]");send("\" eval="); dosend=1;}
 [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; }
 [Aa][Nn][Ss][Bb][Oo][Xx]     { LLDBUG_PR1("[SHOW_ANS_BOX]"); dosend=0; }
@@ -793,7 +846,22 @@ EndLine    ([\r][\n]|[\n])
 			       dosend=1;
 			       flush_delayed();
 			       if (firstparam!=1) send("\" />\n");
-			       send("\t\n\n");
+			       send("\t\n");
+                         /* Fill in Hints */ 
+			       if ( !is_dest_empty(HINT_DEST) ) {
+			         send("\n\t\n\t");
+                                 end_streams(HINT_DEST,0);
+                                 HINTflag=0;
+                                 send("\t\n\t\n\n");
+			       }
+			       send("\n\n");
+
+			       if ( !is_dest_empty(EXP_DEST) ) {
+			         send("\n\t\n");
+                                 end_streams(EXP_DEST,0);
+                                 EXPflag=0;
+                                 send("\t\n\n");
+                               }
                              }
 }
 
@@ -808,22 +876,12 @@ EndLine    ([\r][\n]|[\n])
                                  if (dosend==2) add_delayed("&%s",yytext);
 				 Pcount++;
                                }
-{Alpha}{AlphaNum}*{Space}*[\[]  {  char aline[MAX_FUNC_NAME];
-                                   int  i;   
-                                   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);
+{Alpha}{AlphaNum}*{Space}*[\[]  {
+                                   LLDBUG_PR2("[ARRAY<%s>]",yytext);
                                    
-                                   yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */
-                                   yylval->s_name = strsave(aline); /* free it in parser() */
-                                   yylval->s_type = ARRAY_ID;
-                                   
-                                   yyless(yyleng-1); /* <-- push back char '[' */
-                                   RETURN(ARRAY_ID);
+                                   yyless(yyleng-1); /*<-- push back char '[' */
+                                   if (dosend==1) send("$%s",yytext); 
+                                   if (dosend==2) add_delayed("$%s",yytext); 
                                }
 {Number}*"\."{Number}*[Ee]"+"{Number}+ |
 {Number}*"\."{Number}*[Ee]{Number}+    |
@@ -841,8 +899,14 @@ EndLine    ([\r][\n]|[\n])
                              if (dosend==1) send("%s",yytext);
                              if (dosend==2) add_delayed("%s",yytext);
 			  }
-[\[]                      { LLDBUG_PR1("[dis let ans map '[']");         return(yytext[0]); }
-[\]]                      { LLDBUG_PR1("[dis let ans map ']']");         return(yytext[0]); }
+[\[]                      { LLDBUG_PR1("[dis let ans map '[']");
+			    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 */ }
 }
 
@@ -930,6 +994,7 @@ EndLine    ([\r][\n]|[\n])
 			 BEGIN S_ECHO;
                       }
                     }
+[%]                 {send("%%");}
 {Operator}          { LLDBUG_PR2("[Op(%c) in VAR,TF_STMT,LET]",yytext[0]); send(yytext); }
 }
 
@@ -988,6 +1053,9 @@ EndLine    ([\r][\n]|[\n])
                       send("'");
 		      yy_pop_state();
 		    }
+[%]                 { /*Escape percent signs so that vasprintf doesn't choke */
+                      send("%%");
+                    }
 {EndLine}           { /* check for termination of string constant */
                       char warn_msg[WARN_MSG_LENGTH];