--- loncom/homework/CAPA-converter/capaLexerDef.flex 2000/11/21 18:43:29 1.6 +++ loncom/homework/CAPA-converter/capaLexerDef.flex 2001/11/21 18:48:05 1.11 @@ -119,11 +119,10 @@ Symbol *FmlSymbLast_p; int FmlSymb_cnt; int Symb_count; -int IFstatus[MAX_FUNC_NEST]; /* <-- perhaps we can use linked list */ -int IFcurrent[MAX_FUNC_NEST]; /* <-- perhaps we can use linked list */ 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 */ #ifdef USE_DYNAMIC_SYMBOLS Symbol *SymbList_p; @@ -361,7 +360,7 @@ EndLine ([\r][\n]|[\n]) %n 1000 %x S_COMMENT S_HINT S_HINTEXLAINX S_IMPORT S_EXPLAIN S_ENDX S_UNIT S_IGNORE %x S_SKIP S_VARIABLE S_LET S_DEFINE S_TEXT S_MAP S_FIGURE S_ANSWER -%x S_STRING S_ANSCONTINUE S_TRUE_FALSE_STMT S_IF_SKIP S_WHILE_SKIP +%x S_STRING S_ANSCONTINUE S_TRUE_FALSE_STMT S_WHILE_SKIP %x S_NEXT_LINE S_VERB S_ECHO S_STRINGINANS %array @@ -401,8 +400,7 @@ EndLine ([\r][\n]|[\n]) send("
\n");
                                  }
 ^{Spaces}"/HIN"{Alpha}*{Spaces}  { LLDBUG_PRL1("[HIN]"); 
-                                   start_mode(MODE_BLOCK,
-					      "condition=\"&hinton\"");
+                                   start_mode(MODE_HINT, "");
 				   BEGIN S_HINT; 
                                  }
 ^{Spaces}"/EXP"{Alpha}*{Spaces}  { start_mode(MODE_BLOCK,"condition=&explanation");
@@ -436,7 +434,7 @@ EndLine    ([\r][\n]|[\n])
                                 BEGIN S_ANSWER; 
                                 end_mode();
 				start_mode(MODE_ANSWER,NULL);
-                                send("]\n",While_idx);
@@ -485,18 +484,48 @@ EndLine    ([\r][\n]|[\n])
                                 BEGIN S_TRUE_FALSE_STMT; RETURN(CAPA_WHILE); 
                                 
                               }
-^{Spaces}"/IF"                { IFcount++; IFcurrent[IFcount] = RUN_IF_PORTION;
-                                LLDBUG_PRL2("[IF ]",IFcount);  BEGIN S_TRUE_FALSE_STMT; RETURN(CAPA_IF); }
-^{Spaces}"/ELSE"([^\n])*        { LLDBUG_PRL2("[ELSE ]\n",IFcount); 
-                                IFcurrent[IFcount] = RUN_ELSE_PORTION;
-                                if( IFstatus[IFcount] == IF_TRUE ) {
-                                  LLDBUG_PRL1("[ELSE begin Skip]\n");
-                                  BEGIN S_IF_SKIP;
-                                }
-                              }
-^{Spaces}"/ENDIF"([^\n])*    { IFcount--; LLDBUG_PRL2("[ENDIF ]\n",IFcount); 
+^{Spaces}"/IF"                { int i;
+				IFcount++;
+                                LLDBUG_PRL2("[IF ]",IFcount);
+				BEGIN S_TRUE_FALSE_STMT;
+				if ( IFcount == 1) {
+ 				  start_streams(2);
+				  watch_mode[1]=1;
+				}
+				end_mode_stream(0);
+				start_mode_stream(1,MODE_SCRIPT,NULL);
+				for(i=1;i]\n",IFcount);
+				end_mode_stream(0);
+				for(i=1;i\n",
+				      cached_data[current_cache].str);
+				send_stream(1,"} else {");
+                              }
+^{Spaces}"/ENDIF"([^\n])*     { int i;
+				IFcount--;
+				end_mode_stream(0);
+				for(i=0;i");
+				send_stream(1,"}");
+				if (IFcount == 0) {
+				  if (watch_mode[1]) {
+				    end_streams(1);
+ 				  } else {
+				    end_streams(0);
+				  }
+				}
+				delete_cache();
+				LLDBUG_PRL2("[ENDIF ]\n",IFcount); 
                               }
-"/AND"                        { LLDBUG_PRL1("[AND]"); BEGIN S_ANSCONTINUE; RETURN(ANS_AND); }
+"/AND"                        { LLDBUG_PRL1("[AND]"); /*implict in LON-CAPA*/}
 "/DIS"                        { /* since S_VARIABLE treat {Space} as null, so here we do not match ( */
                                 /* so that between /DIS and ( can have as many {Space} as we want */
                                 LLDBUG_PR1("[DIS<]");
@@ -629,8 +658,6 @@ EndLine    ([\r][\n]|[\n])
 {
 [/][Dd][Ii][Ss]{Space}*[\(]{Space}*  {  yy_push_state(S_HINTEXLAINX); }
 [^/\n]+[/\\]                    { char  *aptr = yytext;
-                                  int    ii;
-                                
                                   yyless(yyleng-1);
 				  send(aptr);
                                 }
@@ -638,8 +665,7 @@ EndLine    ([\r][\n]|[\n])
 [\\]                           { send("\\"); }
 [\\]{Space}*[\n]               { LLDBUG_PR1("[\\CR hint explain continue]"); /* Hint and explain continuation */ }
 [^/\n\\]+$                     {char  *aptr = yytext;
-                                int    ii;
-				send(aptr);
+                                send(aptr);
                                }
 }
 {
@@ -656,51 +682,30 @@ EndLine    ([\r][\n]|[\n])
 }
 
 {
-{Alpha}{AlphaNum}*            { char   *aptr;
-                                char    tmp_str[QUARTER_K],warn_msg[ONE_K];
-                                int     ii, len;
-                                Symbol *tmp_p;
-                                
-                                /*tmp_p = find_identifier(yytext);*/
-                                switch(tmp_p->s_type) {
-                                  case IDENTIFIER:
-                                        sprintf(warn_msg,"var %s not defined.\n", yytext);
-                                        capa_msg(MESSAGE_ERROR,warn_msg);
-                                       break;
-                                  case I_VAR:
-                                  case I_CONSTANT: 
-                                         sprintf(tmp_str,"%ld",tmp_p->s_int);
-                                         len = strlen(tmp_str);
-                                         for(ii=0;ii< len;ii++) {
-                                           *Current_char_p++ = tmp_str[ii];
-                                         }
-                                       break;
-                                  case R_VAR:
-                                  case R_CONSTANT: 
-                                         sprintf(tmp_str,"%g",tmp_p->s_real);
-                                         len = strlen(tmp_str);
-                                         for(ii=0;ii< len;ii++) {
-                                           *Current_char_p++ = tmp_str[ii];
-                                         }
-                                       break;
-                                  case S_VAR:
-                                  case S_CONSTANT: 
-                                         len = strlen(tmp_p->s_str);
-                                         aptr = tmp_p->s_str;
-                                         for(ii=0;ii< len;ii++) {
-                                           *Current_char_p++ = *aptr++;
-                                         }
-                                       break;
-                                }
-				printf("FIXME!Hint: %s\n",yytext);
-                              }
+{Alpha}{AlphaNum}*            {send("${%s}",yytext);}
 {Space}+                      { }
 [)]                           {  yy_pop_state(); }
 }
 
 {
-{FileName}{Space}*             { end_mode();send("/res/capa/%s\n",yytext); BEGIN S_SKIP; }
-{Identifier}{Space}*           { end_mode();send("$%s\n",yytext);  BEGIN S_SKIP; }
+{FileName}{Space}*             { char *endquote;
+                                 end_mode();
+				 start_mode(MODE_IMPORT,NULL);
+				 endquote = strrchr(yytext,'\"');
+                                 *endquote = '\0';
+                                 if (yytext[1] == '/') {
+                                    send("%s%s",import_prefix,&yytext[1]);
+                                 } else {
+                                    send("%s",&yytext[1]);
+                                 }
+                               }
+{Identifier}{Space}*           { end_mode();
+				 start_mode(MODE_IMPORT,NULL);
+				 send("$%s",yytext);
+			       }
+{Space}+                       { }
+{EndLine}                      {end_mode(); BEGIN S_TEXT;}
+
 }
 
 {
@@ -722,7 +727,7 @@ EndLine    ([\r][\n]|[\n])
 [,=]                  { LLDBUG_PR2("[symbol(%s)]",yytext);}
 [%]                  { LLDBUG_PR2("[symbol(%s)]",yytext); 
                        if (dosend==1) send("%s",yytext);
-                       if (dosend==2) add_delayed("%s",yytext);
+                       if (dosend==2) add_delayed("%%%s",yytext);
                      }
 [:@#-]                  { LLDBUG_PR2("[symbol(%s)]",yytext); 
                           if (dosend==1) send("%s",yytext);
@@ -738,23 +743,35 @@ EndLine    ([\r][\n]|[\n])
                              }
 
 [Pp][Cc][Rr]                 |
-[Hh][Gg][Rr]                 { if (firstparam) firstparam=0; else add_delayed("\">\n\t");
-                               add_delayed("\n\t");
+			       }
+                               add_delayed("\n\t");
-			       add_delayed("\n\t");
+			       }
+			       add_delayed("\n\t");
-			       add_delayed("\n\t");
+			       }
+			       add_delayed("\n\t");
 			       dosend=1;
 			       flush_delayed();
-			       if (!firstparam) send("\">");
-			       send("\n\t\n\n");
+			       if (firstparam!=1) send("\" />\n");
+			       send("\t\n\n");
                              }
 }
 
@@ -837,7 +854,7 @@ EndLine    ([\r][\n]|[\n])
 {
 [\"]                      { LLDBUG_PR1("[TF,V,LET,MAP str\" ]"); 
                             Current_char_p = String_buf; 
-			    send("\"");
+			    send("'");
                             yy_push_state(S_STRING);
                           }
 }
@@ -850,7 +867,7 @@ EndLine    ([\r][\n]|[\n])
 }
 
 {
-[\(]                      { LLDBUG_PR1("[dis let ans map (]"); 
+[\(]                      { LLDBUG_PR1("[let if ans map (]"); 
                             Pcount++; 
 			    if (Pcount > 1 ) {
 			      if (dosend==1) send(yytext);
@@ -860,7 +877,7 @@ EndLine    ([\r][\n]|[\n])
 }
 
 {
-[\(]                      { LLDBUG_PR1("[dis let ans map (]"); 
+[\(]                      { LLDBUG_PR1("[let (]"); 
                             Pcount++; 
 			    send(yytext);
                           }
@@ -870,12 +887,40 @@ EndLine    ([\r][\n]|[\n])
                              end_delayed();
                              send("&format(");
                              flush_delayed();
-                             send(",\"%s\")",yytext+1);
+                             send(",'%s')",yytext+1);
                            }
 [:]{Number}+[EeFf]   { 
                              if (dosend) send("\" format=\"%s",yytext+1);
                            }
 
+{
+[;]   { 
+        if (sccount==0) {
+          send(",[\\");
+          sccount++;
+        } else if (sccount==1) {
+          send("],[");
+          sccount++;
+        }
+       }
+[,]     {
+        if (sccount==1) {
+          send(",\\");
+        } else {
+          send(",");
+        }
+      }
+[\)]  {
+        LLDBUG_PR1("[) in MAP]"); Pcount--; 
+        if(Pcount==0) {
+          BEGIN S_SKIP; 
+        }
+        /* you might need a ; in the string below */
+        send("]%c;\n",yytext[0]);
+        sccount=0;
+      }
+}
+
 {
 "=="                { LLDBUG_PR1("[==]"); send(yytext);  }
 "!="                { LLDBUG_PR1("[!=]"); send(yytext);  }
@@ -914,10 +959,24 @@ EndLine    ([\r][\n]|[\n])
 }
 
 {
-[\)]                     { LLDBUG_PRL1("[) in TRUE_FALSE]"); Pcount--; if(Pcount == 0)  BEGIN S_NEXT_LINE; return(yytext[0]); }
-[\\]{Space}*{EndLine}    { LLDBUG_PR2("[\\EoL continue in S_TRUE_FALSE_STMT](%s)",yytext); /* continuation on next line */ }                       
-{EndLine}                { LLDBUG_PR1("[EoL within /IF()]\n"); RETURN(EoL); }
-.                   { char warn_msg[WARN_MSG_LENGTH]; 
+[\)]                     { 
+                           LLDBUG_PRL1("[) in TRUE_FALSE]");
+			   Pcount--; 
+			   if(Pcount == 0)  {
+				stop_cache();
+				send_stream(0,"\">\n");
+				send_stream(1,") {\n");
+				BEGIN S_NEXT_LINE;
+			   }
+			 }
+[\\]{Space}*{EndLine}    { 
+			   LLDBUG_PR2("[\\EoL continue in S_TRUE_FALSE_STMT](%s)",yytext); /* continuation on next line */ 
+			 }                       
+{EndLine}                { 
+			   LLDBUG_PR1("[EoL within /IF()]\n"); RETURN(EoL);
+			 }
+.                   { 
+		      char warn_msg[WARN_MSG_LENGTH]; 
                       sprintf(warn_msg,"In /IF(), an unexpected char [%c] is encountered.\n",yytext[0]);
                       capa_msg(MESSAGE_ERROR,warn_msg);
                     }
@@ -931,7 +990,7 @@ EndLine    ([\r][\n]|[\n])
 [\\][\"]            { /**Current_char_p++ = '"';*/ send("\\\"");  }
 [\\]{Space}*[\n]    { LLDBUG_PR2("[\\CR continue in S_STRING](%s)",yytext); /* continuation on next line */ }                       
 [\"]                { /* end of a string constant --   */
-                      send("\"");
+                      send("'");
 		      yy_pop_state();
 		    }
 {EndLine}           { /* check for termination of string constant */
@@ -995,56 +1054,15 @@ EndLine    ([\r][\n]|[\n])
                              }
 }
 
-{
-[;,]                         { LLDBUG_PR2("[%c]",yytext[0]); send("%c",yytext[0]);  }
-[\)]                         { LLDBUG_PR1("[) in MAP]"); Pcount--; 
-                               if(Pcount==0) {
-                                   BEGIN S_SKIP; 
-                               }
-                               send("%c",yytext[0]); 
-                             }
-}
-
 {
 {Space}+                 { /* ignore white spaces */ }
 [\\]{Space}*{EndLine}    { /* continuation */ }
 {EndLine}                { /* end of answer and/or other answers */ LLDBUG_PR1("[complete an answer]"); 
                            BEGIN S_TEXT; }
-"/AND"                   { LLDBUG_PR1("[AND]"); RETURN(ANS_AND); }
+"/AND"                   { LLDBUG_PR1("[AND]"); /* implicit in LON-CAPA */ }
 "/OR"                    { LLDBUG_PR1("[OR]");  RETURN(ANS_OR);  }
 }
 
-{
-^{Spaces}"/IF"[^\n]*{EndLine}    { IFcount++; LLDBUG_PRL2("[Skip IF ]\n",IFcount); 
-                                   IFstatus[IFcount] = IF_DONT_CARE;
-                                 }
-^{Spaces}"/ELSE"[^\n]*{EndLine}  {  LLDBUG_PRL2("[Skip ELSE ]",IFcount);
-                            IFcurrent[IFcount]=RUN_ELSE_PORTION; 
-                            if( IFstatus[IFcount] == IF_FALSE ) {
-                               LLDBUG_PRL1("[ELSE begin TEXT CR]\n");
-                               BEGIN S_TEXT;
-                            } 
-                            if( IFstatus[IFcount] == IF_TRUE ) {
-                               LLDBUG_PRL1("[ELSE THIS SHOULD NEVER HAPPEN.]\n");
-                            }
-                         }
-^{Spaces}"/ENDIF"[^\n]*{EndLine} { IFcount--; LLDBUG_PRL2("[Skip ENDIF ]\n",IFcount);
-                            if( IFcount == 0 ) {
-                               LLDBUG_PRL1("[ENDIF begin TEXT CR]\n");
-                               BEGIN S_TEXT;
-                            }
-                            if( (IFcurrent[IFcount] == RUN_IF_PORTION )&&(IFstatus[IFcount] == IF_TRUE)) {
-                               LLDBUG_PRL1("[ENDIF begin TEXT CR]\n");
-                               BEGIN S_TEXT;
-                            }
-                            if( (IFcurrent[IFcount] == RUN_ELSE_PORTION )&&(IFstatus[IFcount] == IF_FALSE)) {
-                               LLDBUG_PRL1("[ENDIF begin TEXT CR]\n");
-                               BEGIN S_TEXT;
-                            }
-                         }
-{EndLine}                { LLDBUG_PRL1("[SkipIF a CR]\n");       }
-[^\n]*$                  { LLDBUG_PRL2("[SkipIF anything ]",IFcount);   }
-}
 {
 ([.]*){EndLine}          { /* this ignores everything until it hits an EoL */
                            LLDBUG_PRL2("[ skip \'%s\' until EoL]\n",yytext); 
@@ -1081,8 +1099,6 @@ EndLine    ([\r][\n]|[\n])
 %%
 
 /* ========================================================================================== */
-extern void
-begin_if_skip() { BEGIN S_IF_SKIP; }
 
 extern void
 begin_while_skip() { Wcount=0; While_idx--; /* while is FALSE, pop it out from stack */ BEGIN S_WHILE_SKIP; }