--- loncom/homework/CAPA-converter/capaLexerDef.flex 2000/05/15 20:33:33 1.3 +++ loncom/homework/CAPA-converter/capaLexerDef.flex 2001/11/18 09:49:43 1.10 @@ -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; @@ -140,6 +139,8 @@ extern Problem_t *LexiPro extern Problem_t *LastProblem_p; int first_run=1; int Stop_Parser; +static int dosend=1; +static int firstparam=1; #define FLEX #define YY_STACK_USED 1 /* for yy_push_state(), yy_pop_state() */ @@ -359,8 +360,8 @@ 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_NEXT_LINE S_VERB +%x S_STRING S_ANSCONTINUE S_TRUE_FALSE_STMT S_WHILE_SKIP +%x S_NEXT_LINE S_VERB S_ECHO S_STRINGINANS %array @@ -380,7 +381,7 @@ EndLine ([\r][\n]|[\n]) { {EndLine}{Spaces}"//"[^\n]*$ {LLDBUG_PRL2("[COMMENT<%s>]\n",yytext); - send("%s",yytext); + send("# %s\n",&yytext[2]); } [^\n]*{EndLine} { send("\n"); BEGIN S_TEXT; @@ -394,20 +395,17 @@ EndLine ([\r][\n]|[\n]) } ^{Spaces}"/VERB" { LLDBUG_PRL1("[VERBATIM]"); - Dynamic_buf = (char *)capa_malloc(sizeof(char),10); - Dynamic_buf_max = 10; - Dynamic_buf_cur = 0; - Dynamic_buf[0] = '\0'; BEGIN S_VERB; + start_mode(MODE_OUTTEXT,NULL); + 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");
                                    LLDBUG_PRL1("[EXP]"); Current_char_p = String_buf;  BEGIN S_EXPLAIN; }
-^{Spaces}"/IMP"{Alpha}*{Space}+  { LLDBUG_PRL1("[IMP]"); BEGIN S_IMPORT; }
+^{Spaces}"/IMP"{Alpha}*{Space}+  { LLDBUG_PRL1("[IMP]"); BEGIN S_IMPORT; end_mode(); }
 ^{Spaces}"/END"                  { LLDBUG_PRL1("[END]");  
                                     if ( (LexiProblem_p !=NULL) && 
 					 (LexiProblem_p->question != NULL) && 
@@ -417,7 +415,7 @@ EndLine    ([\r][\n]|[\n])
 				    } else {
 				      EndText_p=NULL;
 				    }
-				    End_of_input = 1; BEGIN S_IGNORE;RETURN(CAPA_END); 
+				    End_of_input = 1; BEGIN S_IGNORE; 
                                   }
 ^{Spaces}"/START"[^\n]*          { LLDBUG_PRL1("[START]");  
                                     if (LexiProblem_p !=NULL && 
@@ -427,15 +425,30 @@ EndLine    ([\r][\n]|[\n])
 				      StartText_p=NULL;
 				    }
 				    BEGIN S_TEXT;
-				    RETURN(CAPA_START); 
                                   }
                                   
 ^{Spaces}"/END"{Spaces}[\(]{Spaces}      { LLDBUG_PRL1("[END()]"); BEGIN S_ENDX; }
 ^"/DEF"                       { Bcount = 0; BEGIN S_DEFINE; RETURN(CAPA_DEF); }
-^{Spaces}"/ANS"               { LLDBUG_PRL2("[ANS(%s)]",yytext); Pcount = 0; BEGIN S_ANSWER; RETURN(CAPA_ANS); }
-^{Spaces}"/SUBJECTIVE"        { LLDBUG_PRL1("[SUBJECTIVE ANSWER]"); Pcount = 0; BEGIN S_ANSWER; RETURN(CAPA_SUBJ); }
-^{Spaces}"/MAP"               { LLDBUG_PRL1("[MAP]");  Pcount = 0; BEGIN S_MAP;   RETURN(CAPA_MAP); }
-^{Spaces}"/RMAP"              { LLDBUG_PRL1("[RMAP]"); Pcount = 0; BEGIN S_MAP;   RETURN(CAPA_RMAP); }
+^{Spaces}"/ANS"               { LLDBUG_PRL2("[ANS(%s)]",yytext); 
+                                Pcount = 0; 
+                                BEGIN S_ANSWER; 
+                                end_mode();
+				start_mode(MODE_ANSWER,NULL);
+                                send("]\n",While_idx);
@@ -471,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}"/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])*    { IFcount--; LLDBUG_PRL2("[ENDIF ]\n",IFcount); 
+^{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<]");
@@ -495,18 +538,16 @@ EndLine    ([\r][\n]|[\n])
                                 send("\n"); }
 [\\]{Space}*{EndLine}         { LLDBUG_PR2("[\\EoL continue](%s)",yytext); /* continuation on next line */ }                       
 ^{Spaces}"//"[^\n]*$		      { LLDBUG_PRL2("[COMMENT<%s>]\n",yytext);
-                                        start_mode(MODE_COMMENT,NULL); 
-                                        send("%s\n",yytext);
+                                        start_mode(MODE_SCRIPT,NULL); 
+                                        send("# %s\n",&yytext[2]);
 					BEGIN S_COMMENT;
                                       }
 
 [^/\n\\]+$  |
 [/]         | 
 [\\]                          {  start_mode(MODE_OUTTEXT,NULL);
-                                 yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
-                                yylval->s_str = strsave(yytext);
                                 LLDBUG_PR2("[TEXT_LINE<%s>]",yytext);
-			        //RETURN(TEXT_LINE); 
+				send(yytext);
 			      }
 ([^/\n])+[/] |
 ([^/\n])+[\\]                 { /* matches anything until a '/' or a '\' */
@@ -617,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);
                                 }
@@ -626,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);
                                }
 }
 {
@@ -638,113 +676,136 @@ EndLine    ([\r][\n]|[\n])
 }
 {
 {EndLine}                     {  LLDBUG_PR1("[CR explain]");
-                                 yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
-		                *Current_char_p++ = '\n'; *Current_char_p = '\0';
-	                         yylval->s_str = strsave(String_buf);
-                                 BEGIN S_TEXT; RETURN(EXPLAIN_LINE); 
+                                 send("\n"); 
+                                 BEGIN S_TEXT;
                               }
 }
 
 {
-{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("%s\n",yytext); BEGIN S_SKIP; }
-{Identifier}{Space}*           { end_mode();send("$%s\n",yytext);  BEGIN S_SKIP; }
+{FileName}{Space}*             {
+                                 end_mode();
+				 start_mode(MODE_IMPORT,NULL);
+                                 send("%s/%s",import_prefix,yytext);
+			         end_mode();
+                                 BEGIN S_SKIP; 
+                               }
+{Identifier}{Space}*           { end_mode();
+				 start_mode(MODE_IMPORT,NULL);
+				 send("$%s",yytext);
+				 end_mode();
+				 BEGIN S_SKIP;
+			       }
 }
 
 {
-[Pp][Ll][Uu][Ss]             { LLDBUG_PR1("[PLUS]");  RETURN(ANS_PLUS); }
-[Mm][Ii][Nn][Uu][Ss]         { LLDBUG_PR1("[MINUS]"); RETURN(ANS_MINUS); }
-[Cc][Ss]                     { LLDBUG_PR1("[CS]");    RETURN(ANS_CS); }
-[Cc][Ii]                     { LLDBUG_PR1("[CI]");    RETURN(ANS_CI); }
-[Mm][Cc]                     { LLDBUG_PR1("[MC]");    RETURN(ANS_MC); }
+[Pp][Ll][Uu][Ss]             { LLDBUG_PR1("[PLUS]"); add_delayed("+");}
+[Mm][Ii][Nn][Uu][Ss]         { LLDBUG_PR1("[MINUS]"); add_delayed("-");}
+
+[Cc][Ss]                     { LLDBUG_PR1("[CS]"); send("cs");}
+[Cc][Ii]                     { LLDBUG_PR1("[CI]"); send("ci");}
+[Mm][Cc]                     { LLDBUG_PR1("[MC]"); send("mc");}
+[Ff][Mm][Ll]                 { LLDBUG_PR1("[FORMULA]"); send("fml"); }
+
 [Oo][Nn]                     |
-[Yy][Ee][Ss]                 { LLDBUG_PR1("[ON]");    RETURN(ANS_ON); }
+[Yy][Ee][Ss]                 { LLDBUG_PR1("[ON]"); send("on");}
 [Oo][Ff][Ff]                 |
-[Nn][Oo]                     { LLDBUG_PR1("[OFF]");   RETURN(ANS_OFF); }
-[Ff][Mm][Ll]                 { LLDBUG_PR1("[FORMULA]");   RETURN(ANS_FORMULA); }
-[Ff][Mm][Tt]                 { LLDBUG_PR1("[FMT]");   RETURN(ANS_FMT); }
-[Uu][Nn][Ff][Mm][Tt]         { LLDBUG_PR1("[UNFMT]"); RETURN(ANS_UNFMT); }
-[,:%=@#-]                  { LLDBUG_PR2("[symbol(%s)]",yytext); return(yytext[0]); }
-"<"                          { LLDBUG_PR2("[symbol(%s)]",yytext); return(yytext[0]); }
-">"                          { LLDBUG_PR2("[symbol(%s)]",yytext); return(yytext[0]); }
-[Ss][Ii][Gg]                 { LLDBUG_PR2("[SIG(%s)]",yytext);  RETURN(ANS_SIG); }
-[Tt][Oo][Ll]                 { LLDBUG_PR2("[tol(%s)]",yytext);  RETURN(ANS_TOLERANCE); }
-[Ss][Tt][Rr]                 { LLDBUG_PR1("[STR]");   RETURN(ANS_COMPARE); }
-[Ww][Gg][Tt]                 { LLDBUG_PR1("[WGT]");   RETURN(ANS_WEIGHT); }
+[Nn][Oo]                     { LLDBUG_PR1("[OFF]"); send("off");}
+[Ff][Mm][Tt]                 { LLDBUG_PR1("[FMT]"); }
+[Uu][Nn][Ff][Mm][Tt]         { LLDBUG_PR1("[UNFMT]"); }
+
+[,=]                  { LLDBUG_PR2("[symbol(%s)]",yytext);}
+[%]                  { LLDBUG_PR2("[symbol(%s)]",yytext); 
+                       if (dosend==1) send("%s",yytext);
+                       if (dosend==2) add_delayed("%%%s",yytext);
+                     }
+[:@#-]                  { LLDBUG_PR2("[symbol(%s)]",yytext); 
+                          if (dosend==1) send("%s",yytext);
+                          if (dosend==2) add_delayed("%s",yytext);
+                        }
+"<"                          { LLDBUG_PR2("[symbol(%s)]",yytext);
+                               if (dosend==1) send("%s",yytext);
+                               if (dosend==2) add_delayed("%s",yytext);
+                             }
+">"                          { LLDBUG_PR2("[symbol(%s)]",yytext);
+                               if (dosend==1) send("%s",yytext);
+                               if (dosend==2) add_delayed("%s",yytext);
+                             }
+
 [Pp][Cc][Rr]                 |
-[Hh][Gg][Rr]                 { RETURN(ANS_PCREDIT); }
-[Pp][Aa][Tt][Hh]             { RETURN(ANS_PATH); }
-[Cc][Aa][Ll][Cc]             { RETURN(ANS_CALC); }
-[Tt][Rr][Yy]                 |
-[Tt][Rr][Ii][Ee][Ss]         { LLDBUG_PR1("[TRY]");     RETURN(ANS_TRY); }
-[Uu][Nn][Ii][Tt]             |
-[Uu][Nn][Ii][Tt][Ss]         { LLDBUG_PR1("[UNIT]");    RETURN(ANS_UNIT); }
-[Bb][Rr]                     { LLDBUG_PR1("[SHOW_BR]"); RETURN(ANS_SHOW_BR);  }
-[Vv][Ee][Rr][Bb][Aa][Tt][Ii][Mm] { LLDBUG_PR1("[VERBATIM]"); RETURN(ANS_VERBATIM); }
-[Aa][Nn][Ss][Bb][Oo][Xx]     { LLDBUG_PR1("[SHOW_ANS_BOX]"); RETURN(ANS_BOX_SHOW);  }
-[Hh][Ii][Nn][Tt]             { LLDBUG_PR1("[HINT]");    RETURN(ANS_HINT); }
-[Ee][Xx][Pp][Ll][Aa][Ii][Nn] { LLDBUG_PR1("[EXPLAIN]"); RETURN(ANS_EXPLAIN); }
-[Ee][Xx][Tt][Ee][Rr][Nn][Aa][Ll]  { LLDBUG_PR1("[EXTERNAL]"); RETURN(ANS_EXTERNAL); }
+[Hh][Gg][Rr]                 { if (firstparam) {
+				firstparam=0; 
+			       } else {
+				add_delayed("\" />\n\t");
+			       }
+                               add_delayed("\n\t");
+			       }
+			       add_delayed("\n\t");
+			       }
+			       add_delayed("\n\t");
+			       dosend=1;
+			       flush_delayed();
+			       if (firstparam!=1) send("\" />\n");
+			       send("\t\n\n");
                              }
 }
 
-{
-{Alpha}{AlphaNum}*             { LLDBUG_PR2("[ID<%s>]",yytext);LLDBUG_PR2("[SYMB CNT=<%d>]", Symb_count); 
-send("$%s",yytext); 
+{
+{Alpha}{AlphaNum}*             { LLDBUG_PR2("[ID<%s>]",yytext);
+                                 LLDBUG_PR2("[SYMB CNT=<%d>]", Symb_count); 
+                                 if (dosend==1) send("$%s",yytext); 
+                                 if (dosend==2) add_delayed("$%s",yytext); 
                                }
 
-{Alpha}{AlphaNum}*{Space}*[(]  { char aline[MAX_FUNC_NAME];
-                                 int  i;          
-				 send("&%s",yytext);
+{Alpha}{AlphaNum}*{Space}*[(]  { if (dosend==1) send("&%s",yytext);
+                                 if (dosend==2) add_delayed("&%s",yytext);
 				 Pcount++;
                                }
 {Alpha}{AlphaNum}*{Space}*[\[]  {  char aline[MAX_FUNC_NAME];
@@ -771,43 +832,104 @@ send("$%s",yytext);
 {Number}+[Ee]{Number}+    |
 {Number}+[Ee]"-"{Number}+ |
 {Number}+"\."{Number}*    |
-"\."{Number}+             {  
-                             LLDBUG_PR2("[REAL<%s>]",yytext);
-			     send(yytext);
+"\."{Number}+             {  LLDBUG_PR2("[REAL<%s>]",yytext);
+			     if(dosend==1) send("%s",yytext);
+			     if(dosend==2) add_delayed("%s",yytext);
 			  }
 
-{Number}+                 {  
-                             LLDBUG_PR2("[INT<%s>]",yytext);
-                             send(yytext);
+{Number}+                 {  LLDBUG_PR2("[INT<%s>]",yytext);
+                             if (dosend==1) send("%s",yytext);
+                             if (dosend==2) add_delayed("%s",yytext);
 			  }
-[\(]                      { LLDBUG_PR1("[dis let ans map (]"); Pcount++; if (Pcount > 1 ) {send(yytext);} }
 [\[]                      { LLDBUG_PR1("[dis let ans map '[']");         return(yytext[0]); }
 [\]]                      { LLDBUG_PR1("[dis let ans map ']']");         return(yytext[0]); }
 {Space}+                  { /* LLDBUG_PR1("[SP ignored]");  Ignore Spaces */ }
-[\"]                      { LLDBUG_PR1("[TF,V,LET,ANS,MAP str\" ]"); 
+}
+
+{
+[\"]                      { LLDBUG_PR1("[TF,V,LET,MAP str\" ]"); 
                             Current_char_p = String_buf; 
-			    send("\"");
+			    send("'");
                             yy_push_state(S_STRING);
                           }
 }
 
-[:]{Number}+[EeFf]   { 
+{
+[\"]                      { LLDBUG_PR1("[ANS str\" ]"); 
+                            Current_char_p = String_buf; 
+                            yy_push_state(S_STRINGINANS);
+                          }
+}
+
+{
+[\(]                      { LLDBUG_PR1("[let if ans map (]"); 
+                            Pcount++; 
+			    if (Pcount > 1 ) {
+			      if (dosend==1) send(yytext);
+			      if (dosend==2) add_delayed(yytext);
+			    } 
+                          }
+}
+
+{
+[\(]                      { LLDBUG_PR1("[let (]"); 
+                            Pcount++; 
+			    send(yytext);
+                          }
+}
+
+[:]{Number}+[EeFf]   { 
                              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("[==]"); RETURN(EQ_op);  }
-"!="                { LLDBUG_PR1("[!=]"); RETURN(NE_op);  }
-">"                 { LLDBUG_PR1("[>]");  RETURN(GT_op);  }
-">="                { LLDBUG_PR1("[>=]"); RETURN(GE_op);  }
-"<"                 { LLDBUG_PR1("[<]");  RETURN(LT_op);  }
-"<="                { LLDBUG_PR1("[<=]"); RETURN(LE_op);  }
-"&&"                { LLDBUG_PR1("[&&]"); RETURN(AND_op); }
-"||"                { LLDBUG_PR1("[||]"); RETURN(OR_op);  }
-"//"                { if(Pcount==0) BEGIN S_SKIP;         }
+"=="                { LLDBUG_PR1("[==]"); send(yytext);  }
+"!="                { LLDBUG_PR1("[!=]"); send(yytext);  }
+">"                 { LLDBUG_PR1("[>]");  send(yytext);  }
+">="                { LLDBUG_PR1("[>=]"); send(yytext);  }
+"<"                 { LLDBUG_PR1("[<]");  send(yytext);  }
+"<="                { LLDBUG_PR1("[<=]"); send(yytext);  }
+"&&"                { LLDBUG_PR1("[&&]"); send(yytext);  }
+"||"                { LLDBUG_PR1("[||]"); send(yytext);  }
+"//"                { if(Pcount==0) {
+			 send("; #");
+			 BEGIN S_ECHO;
+                      }
+                    }
 {Operator}          { LLDBUG_PR2("[Op(%c) in VAR,TF_STMT,LET]",yytext[0]); send(yytext); }
 }
 
@@ -832,10 +954,24 @@ send("$%s",yytext);
 }
 
 {
-[\)]                     { 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);
                     }
@@ -849,7 +985,7 @@ send("$%s",yytext);
 [\\][\"]            { /**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 */
@@ -865,6 +1001,34 @@ send("$%s",yytext);
                     }
 }
 
+{
+[\\][\\]            { /*char  *aptr = yytext;
+			while( *aptr )   *Current_char_p++ = *aptr++;*/
+                      if (dosend==1) send("%s",yytext);
+		      if (dosend==2) add_delayed("%s",yytext);
+                    }
+[\\][\"]            { /**Current_char_p++ = '"';*/ 
+                      if (dosend==1) send("%s",yytext);
+		      if (dosend==2) add_delayed("%s",yytext);
+                    }
+[\\]{Space}*[\n]    { LLDBUG_PR2("[\\CR continue in S_STRING](%s)",yytext); /* continuation on next line */ }                       
+[\"]                { /* end of a string constant --   */
+		      yy_pop_state();
+		    }
+{EndLine}           { /* check for termination of string constant */
+                      char warn_msg[WARN_MSG_LENGTH];
+                      
+                      sprintf(warn_msg,"STRING not terminated properly, an EoL encountered in the middle.\n%s\n",String_buf);
+                      capa_msg(MESSAGE_ERROR,warn_msg);
+                      yy_pop_state();
+                    }
+.                   { /*char  *aptr = yytext;
+			while( *aptr )   *Current_char_p++ = *aptr++;*/
+                      if (dosend==1) send("%s",yytext);
+		      if (dosend==2) add_delayed("%s",yytext);
+                    }
+}
+
 [\)]                  { LLDBUG_PR1("[) in LET]"); Pcount--;send(yytext); }
 
 {
@@ -872,18 +1036,16 @@ send("$%s",yytext);
 {EndLine}                    { BEGIN S_TEXT; }
 }
 
-{
-[\\]{Space}*{EndLine}        { LLDBUG_PR1("[\\EoL let ans map]"); /* continuation */ }
-{EndLine}                    { LLDBUG_PR1("[EoL END let ans map]\n"); if(Pcount == 0) BEGIN S_TEXT; send(yytext); }
+{
+[^\n]+$                      { send(yytext); }
+{EndLine}                    { send(yytext); BEGIN S_TEXT; }
 }
 
-{
-[;,]                         { LLDBUG_PR2("[%c]",yytext[0]); return(yytext[0]);  }
-[\)]                         { LLDBUG_PR1("[) in MAP]"); Pcount--; 
-                               if(Pcount==0) {
-                                   BEGIN S_SKIP; 
-                               }
-                               return(yytext[0]); 
+{
+[\\]{Space}*{EndLine}        { LLDBUG_PR1("[\\EoL let ans map]"); /* continuation */ }
+{EndLine}                    { LLDBUG_PR1("[EoL END let ans map]\n"); 
+                               if(Pcount == 0) BEGIN S_TEXT; 
+                               send(";%s",yytext); 
                              }
 }
 
@@ -892,41 +1054,10 @@ send("$%s",yytext);
 [\\]{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); 
@@ -953,22 +1084,16 @@ send("$%s",yytext);
 
 {
 ^{Spaces}"/ENDVERB" { LLDBUG_PRL1("[END VERB]\n"); 
-                      yylval = (Symbol *) capa_malloc(1, sizeof(Symbol));
-		      yylval->s_str = strsave(Dynamic_buf);  /* ****   */
-		      yylval->s_type = S_CONSTANT;  
-		      capa_mfree(Dynamic_buf);
-		      Dynamic_buf_cur=-1;
-		      Dynamic_buf_max=0;
-		      BEGIN S_TEXT;   RETURN(VERBATIM);   
+		      BEGIN S_TEXT;
+		      puts("\n
\n"); + end_mode(); } -.*|{EndLine} { append_dynamic_buf(yytext); } +.*|{EndLine} { send(yytext); } } %% /* ========================================================================================== */ -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; } @@ -1573,6 +1698,7 @@ int capa_eof() LexiProblem_p=NULL; /* printf("\nCAPA EOF\n"); fflush(stdout); */ } + end_mode(); return (0); #endif /*AVOIDYYINPUT*/ }