--- loncom/homework/CAPA-converter/capaLexerDef.flex 2002/03/20 18:19:59 1.20 +++ loncom/homework/CAPA-converter/capaLexerDef.flex 2002/09/12 15:54:06 1.21 @@ -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 While_idx, Wcount; 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 @@ void newyy_input (char *buf,int *result, } \ Input_idx = 0; \ first_run=0; \ - yyin = Input_stream[Input_idx]; LIDBUG_PR1("<>\n"); \ +yyin = Input_stream[Input_idx]; LIDBUG_PR1("<>\n"); \ } \ out_of_char = 0; \ if ( Lexi_buf[Input_idx] == NULL ) { \ @@ -435,6 +438,7 @@ EndLine ([\r][\n]|[\n]) HINTflag=-1; } change_destination(HINT_DEST); + send("\t",NULL); BEGIN S_HINT; } ^{Spaces}"/EXP"{Alpha}*{Spaces} { @@ -443,6 +447,7 @@ EndLine ([\r][\n]|[\n]) 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 @@ EndLine ([\r][\n]|[\n]) send("]\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(""); 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 @@ EndLine ([\r][\n]|[\n]) } [/] { 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 @@ EndLine ([\r][\n]|[\n]) } { -{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 @@ EndLine ([\r][\n]|[\n]) } {Identifier}{Space}* { end_mode(); start_mode(MODE_IMPORT,NULL); - send("$%s",yytext); + send("${%s}",yytext); end_mode(); BEGIN S_SKIP; } @@ -782,12 +792,18 @@ EndLine ([\r][\n]|[\n]) 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 @@ EndLine ([\r][\n]|[\n]) [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 @@ EndLine ([\r][\n]|[\n]) 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(" Enter your answer here.\n"); + } else { send("\t\n"); + } /* Fill in Hints */ if ( !is_dest_empty(HINT_DEST) ) { - send("\n\t\n\t"); + send("\t\n\t\n\t"); end_streams(HINT_DEST,0); HINTflag=0; - send("\t\n\t\n\n"); + send("\t\n\t\n\t\n"); + } + if (essay_answer) { + send("\n"); + } else { + send("\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"); + } +} + +{ +{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 @@ EndLine ([\r][\n]|[\n]) } {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 @@ EndLine ([\r][\n]|[\n]) } } +{ +"+" { send(".");} +} + { -"==" { 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 @@ EndLine ([\r][\n]|[\n]) [\)] { LLDBUG_PR1("[)]"); Pcount--; if(Pcount == 0) { + send(""); BEGIN S_TEXT; flush_delayed(); } else { @@ -1027,6 +1066,9 @@ EndLine ([\r][\n]|[\n]) 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 @@ EndLine ([\r][\n]|[\n]) [%] { /*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 @@ EndLine ([\r][\n]|[\n]) } { -{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]"); /* 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("\n\t\n"); + end_streams(EXP_DEST,0); + EXPflag=0; + send("\t\n\n"); + } + send("\n\n"); + } + start_mode(MODE_ANSWER,NULL); + send("]"); + if ( !is_dest_empty(EXP_DEST) ) { + send("\n\t\n"); + end_streams(EXP_DEST,0); + EXPflag=0; + send("\t\n\n"); + } + send("\n\n"); + BEGIN S_TEXT; + } +{Spaces} { /* Do nothing */ } } {