--- loncom/homework/CAPA-converter/capaLexerDef.flex 2001/01/30 21:03:25 1.7 +++ 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 \n"); + if (firstparam!=1) send("\" />\n"); + send("\t]",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,19 +743,31 @@ 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\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; }