[LON-CAPA-cvs] cvs: loncom /homework/CAPA-converter capaLexerDef.flex

albertel lon-capa-cvs@mail.lon-capa.org
Thu, 12 Sep 2002 15:54:07 -0000


This is a MIME encoded message

--albertel1031846047
Content-Type: text/plain

albertel		Thu Sep 12 11:54:07 2002 EDT

  Modified files:              
    /loncom/homework/CAPA-converter	capaLexerDef.flex 
  Log:
  - From Mark Lucas,
   Fixes a few things with /DIS in scripts, eval with fml,
  braces around variables.
  
  
  
--albertel1031846047
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20020912115407.txt"

Index: loncom/homework/CAPA-converter/capaLexerDef.flex
diff -u loncom/homework/CAPA-converter/capaLexerDef.flex:1.20 loncom/homework/CAPA-converter/capaLexerDef.flex:1.21
--- loncom/homework/CAPA-converter/capaLexerDef.flex:1.20	Wed Mar 20 13:19:59 2002
+++ loncom/homework/CAPA-converter/capaLexerDef.flex	Thu Sep 12 11:54:06 2002
@@ -1,6 +1,6 @@
 /* The LearningOnline Network with CAPA
  * CAPA lexer dfinition, heavily modified to become a LON-CAPA convertor 
- * $Id: capaLexerDef.flex,v 1.20 2002/03/20 18:19:59 albertel Exp $
+ * $Id: capaLexerDef.flex,v 1.21 2002/09/12 15:54:06 albertel Exp $
  *
  * Copyright Michigan State University Board of Trustees
  *
@@ -152,6 +152,9 @@
 int           sccount;		           /* Semi-colon count for MAP and RMAP  */
 int           HINTflag=0;
 int           EXPflag=0;
+int           EVALflag=0;
+int           compound_answer=0;
+int           essay_answer=0;
 
 #ifdef  USE_DYNAMIC_SYMBOLS
 Symbol       *SymbList_p;
@@ -244,7 +247,7 @@
        } \
        Input_idx = 0; \
        first_run=0; \
-       yyin = Input_stream[Input_idx]; LIDBUG_PR1("<<yy_input() startup>>\n"); \
+yyin = Input_stream[Input_idx]; LIDBUG_PR1("<<yy_input() startup>>\n"); \
     } \
     out_of_char = 0; \
     if ( Lexi_buf[Input_idx] == NULL ) { \
@@ -435,6 +438,7 @@
                                      HINTflag=-1;
                                    }
                                    change_destination(HINT_DEST);
+                                   send("\t",NULL);
 				   BEGIN S_HINT; 
                                  }
 ^{Spaces}"/EXP"{Alpha}*{Spaces}  { 
@@ -443,6 +447,7 @@
                                      EXPflag=-1;
                                    }
                                    change_destination(EXP_DEST);
+                                   send("\t",NULL);
                                    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]");  
@@ -476,15 +481,19 @@
                                 send("<numericalresponse answer=\""); 
 				dosend=1;
 				firstparam=1;
+                                compound_answer=0;
+                                essay_answer=0;
                               }
 ^{Spaces}"/SUBJECTIVE"        { LLDBUG_PRL1("[SUBJECTIVE ANSWER]"); 
                                 Pcount = 0; 
                                 BEGIN S_ANSWER;
                                 end_mode();
 				start_mode(MODE_ANSWER,NULL);
-                                send("<capasubjectiveresponse");
+                                send("<essayresponse");
 				dosend=1; 
 				firstparam=1;                            
+                                compound_answer=0;
+                                essay_answer=-1;
                               }
 ^{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("); }
@@ -569,15 +578,15 @@
 				delete_cache();
 				LLDBUG_PRL2("[ENDIF <IFcount=%d>]\n",IFcount); 
                               }
-"/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 */
+				start_mode(MODE_OUTTEXT,NULL);
                                 LLDBUG_PR1("[DIS<]");
                                 init_funcstack();
                                 Pcount = 0; BEGIN S_VARIABLE; 
+				send("<display>");
 				start_delayed();
                               }
-"/OR"                         { LLDBUG_PRL1("[OR]"); BEGIN S_ANSCONTINUE;  RETURN(ANS_OR); }
 {EndLine}                     { LLDBUG_PR1("[EoL within S_TEXT]\n"); /* end of the whole text line */ 
                                 send("\n"); }
 [\\]{Space}*{EndLine}         { LLDBUG_PR2("[\\EoL continue](%s)",yytext); /* continuation on next line */ }                       
@@ -707,7 +716,7 @@
                                 }
 [/]                            { send("/"); }
 [\\]                           { send("\\"); }
-[\\]{Space}*[\n]               { LLDBUG_PR1("[\\CR hint explain continue]"); /* Hint and explain continuation */ }
+[\\]{Space}*[\n]               { LLDBUG_PR1("[\\CR hint explain continue]"); /* Hint and explain continuation */ send("\n\t");}
 [^/\n\\]+$                     {char  *aptr = yytext;
                                 send(aptr);
                                }
@@ -734,7 +743,8 @@
 }
 
 <S_IMPORT>{
-{FileName}{Space}*             { char *endquote;
+{FileName}{Space}*             {
+                                 char *endquote;
                                  end_mode();
 				 start_mode(MODE_IMPORT,NULL);
 				 /* Get rid of leading and trailing quotes */
@@ -750,7 +760,7 @@
                                }
 {Identifier}{Space}*           { end_mode();
 				 start_mode(MODE_IMPORT,NULL);
-				 send("$%s",yytext);
+				 send("${%s}",yytext);
 				 end_mode();
                                  BEGIN S_SKIP;
 			       }
@@ -782,12 +792,18 @@
                           if (dosend==2) add_delayed("%s",yytext);
                         }
 "<"                          { LLDBUG_PR2("[symbol(%s)]",yytext);
+			       if (!EVALflag) {
                                if (dosend==1) send("%s",yytext);
                                if (dosend==2) add_delayed("%s",yytext);
                              }
+                             }
 ">"                          { LLDBUG_PR2("[symbol(%s)]",yytext);
+			       if (!EVALflag) {
                                if (dosend==1) send("%s",yytext);
                                if (dosend==2) add_delayed("%s",yytext);
+                               } else {
+				 EVALflag = 0;
+			       }
                              }
 
 [Pp][Cc][Rr]                 |
@@ -821,7 +837,7 @@
 
 [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;}
+[Ee][Vv][Aa][Ll][Uu][Aa][Tt][Ee] { LLDBUG_PR1("[EVAL]");send("\" eval=\""); EVALflag=1; dosend=1;}
 [Uu][Nn][Ii][Tt]             |
 [Uu][Nn][Ii][Tt][Ss]         { LLDBUG_PR1("[UNIT]"); send("\" unit=\""); dosend=1;}
 
@@ -842,25 +858,44 @@
                                if(Pcount==0) {
                                    BEGIN S_ANSCONTINUE; 
                                }
+                               if (essay_answer) {
+                                 send(">\n\t");
+                               } else {
                                send("\">\n\t");
+                               }
 			       dosend=1;
 			       flush_delayed();
 			       if (firstparam!=1) send("\" />\n");
+                               if (essay_answer) {
+			         send("  <textfield>Enter your answer here.</textfield>\n");
+                               } else {
 			       send("\t<textline />\n");
+                               }
                          /* Fill in Hints */ 
 			       if ( !is_dest_empty(HINT_DEST) ) {
-			         send("<hintgroup>\n\t<hintpart on=\"default\">\n\t<startouttext />");
+			         send("\t<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("\t<endouttext />\n\t</hintpart>\n\t</hintgroup>\n");
+			       }
+                               if (essay_answer) {
+			         send("</essayresponse>\n");
+                               } else {
+			         send("</numericalresponse>\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");
+                             }
+}
+
+<S_VARIABLE>{
+{Alpha}{AlphaNum}*             { LLDBUG_PR2("[ID<%s>]",yytext);
+                                 LLDBUG_PR2("[SYMB CNT=<%d>]", Symb_count); 
+                                 if(Pcount <= 1) {
+                                   if (dosend==1) send("${%s}",yytext); 
+                                   if (dosend==2) add_delayed("${%s}",yytext); 
+                                 } else {
+                                   if (dosend==1) send("$%s",yytext); 
+                                   if (dosend==2) add_delayed("$%s",yytext); 
                                }
                              }
 }
@@ -878,7 +913,6 @@
                                }
 {Alpha}{AlphaNum}*{Space}*[\[]  {
                                    LLDBUG_PR2("[ARRAY<%s>]",yytext);
-                                   
                                    yyless(yyleng-1); /*<-- push back char '[' */
                                    if (dosend==1) send("$%s",yytext); 
                                    if (dosend==2) add_delayed("$%s",yytext); 
@@ -980,9 +1014,13 @@
       }
 }
 
+<S_VARIABLE>{
+"+"		    { send(".");}
+}
+
 <S_VARIABLE,S_TRUE_FALSE_STMT,S_LET,S_MAP>{
-"=="                { LLDBUG_PR1("[==]"); send(yytext);  }
-"!="                { LLDBUG_PR1("[!=]"); send(yytext);  }
+"=="                { LLDBUG_PR1("[==]"); send(" eq ");  }
+"!="                { LLDBUG_PR1("[!=]"); send(" ne ");  }
 ">"                 { LLDBUG_PR1("[>]");  send(yytext);  }
 ">="                { LLDBUG_PR1("[>=]"); send(yytext);  }
 "<"                 { LLDBUG_PR1("[<]");  send(yytext);  }
@@ -1004,6 +1042,7 @@
 [\)]                     { LLDBUG_PR1("[)]"); 
                            Pcount--; 
                            if(Pcount == 0) {
+			      send("</display>");
                               BEGIN S_TEXT; 
                               flush_delayed();
                            } else {
@@ -1027,6 +1066,9 @@
 				send_stream(0,"\">\n");
 				send_stream(1,") {\n");
 				BEGIN S_NEXT_LINE;
+			   } else {
+                                send_stream(0,")");
+                                send_stream(1,")");
 			   }
 			 }
 [\\]{Space}*{EndLine}    { 
@@ -1056,6 +1098,9 @@
 [%]                 { /*Escape percent signs so that vasprintf doesn't choke */
                       send("%%");
                     }
+[\']                { /* Escape single quotes so that perl doesn't choke */
+                      send("\\\'");
+                    }
 {EndLine}           { /* check for termination of string constant */
                       char warn_msg[WARN_MSG_LENGTH];
                       
@@ -1118,12 +1163,45 @@
 }
 
 <S_ANSCONTINUE>{
-{Space}+                 { /* ignore white spaces */ }
-[\\]{Space}*{EndLine}    { /* continuation */ }
-{EndLine}                { /* end of answer and/or other answers */ LLDBUG_PR1("[complete an answer<EoL>]"); 
-                           BEGIN S_TEXT; }
-"/AND"                   { LLDBUG_PR1("[AND]"); /* implicit in LON-CAPA */ }
-"/OR"                    { LLDBUG_PR1("[OR]");  RETURN(ANS_OR);  }
+{Spaces}{EndLine}{Spaces}"/AND"  { LLDBUG_PR1("[AND]");
+                                   compound_answer=-1;
+                                   /* implicit in LON-CAPA */ }
+{Spaces}{EndLine}{Spaces}"/OR"   { LLDBUG_PR1("[OR]"); 
+                                   compound_answer=-1;
+				   /*RETURN(ANS_OR); */ }
+{Spaces}{EndLine}{Spaces}"/ANS" { LLDBUG_PRL2("[ANS(%s)]",yytext); 
+                                Pcount = 0; 
+                                BEGIN S_ANSWER; 
+                                end_mode();
+                                if (!compound_answer) {
+			          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");
+                                    }
+                                  send("</part>\n<part>\n"); 
+                                }
+				start_mode(MODE_ANSWER,NULL);
+                                send("<numericalresponse answer=\""); 
+				dosend=1;
+				firstparam=1;
+                                compound_answer=0;
+                                essay_answer=0;
+                                }
+{Spaces}{EndLine}                { 
+/* end of answer and/or other answers */
+                           LLDBUG_PR1("[complete an answer<EoL>]"); 
+			   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");
+                           }
+                           send("</part>\n<part>\n"); 
+                           BEGIN S_TEXT; 
+                         }
+{Spaces}		{ /* Do nothing */ }
 }
 
 <S_NEXT_LINE>{

--albertel1031846047--