--- loncom/homework/CAPA-converter/capaLexerDef.flex 2000/04/12 20:06:16 1.1 +++ loncom/homework/CAPA-converter/capaLexerDef.flex 2002/03/20 18:15:00 1.19 @@ -1,3 +1,30 @@ +/* The LearningOnline Network with CAPA + * CAPA lexer dfinition, heavily modified to become a LON-CAPA convertor + * $Id: capaLexerDef.flex,v 1.19 2002/03/20 18:15:00 albertel Exp $ + * + * Copyright Michigan State University Board of Trustees + * + * This file is part of the LearningOnline Network with CAPA (LON-CAPA). + * + * LON-CAPA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * LON-CAPA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LON-CAPA; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * /home/httpd/html/adm/gpl.txt + * + * http://www.lon-capa.org/ + */ + /*------------------------------------------------------------------------*/ /* capaLexerDef.flex created by Isaac Tsai Jul 15 1996 */ /* added /END(variable) */ @@ -119,11 +146,12 @@ 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 */ +int HINTflag=0; +int EXPflag=0; #ifdef USE_DYNAMIC_SYMBOLS Symbol *SymbList_p; @@ -140,6 +168,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() */ @@ -336,6 +366,7 @@ void newyy_input (char *buf,int *result, #endif int capa_eof(); + %} Alpha [a-zA-Z_] @@ -358,8 +389,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 @@ -378,28 +409,42 @@ EndLine ([\r][\n]|[\n]) } { -^{Spaces}"//"[^\n]*$ { LLDBUG_PRL2("[COMMENT<%s>]\n",yytext); - send(&yytext[2]); - send("\n"); - BEGIN S_COMMENT; - } -. { send("\n"); BEGIN S_TEXT; } +{EndLine}{Spaces}"//"[^\n]*$ {LLDBUG_PRL2("[COMMENT<%s>]\n",yytext); + send("# %s\n",&yytext[2]); + } +[^\n]*{EndLine} { + send("\n"); BEGIN S_TEXT; + } } + { ^{Spaces}"/LET" | -^{Spaces}"/BEG" { LLDBUG_PRL1("[LET]"); Pcount = 0; init_funcstack(); BEGIN S_LET; RETURN(CAPA_LET); } + ^{Spaces}"/BEG" { LLDBUG_PRL1("[LET]"); Pcount = 0; BEGIN S_LET; start_mode(MODE_SCRIPT,NULL); +} ^{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]"); Current_char_p = String_buf;  BEGIN S_HINT; }
-^{Spaces}"/EXP"{Alpha}*{Spaces}  { LLDBUG_PRL1("[EXP]"); Current_char_p = String_buf;  BEGIN S_EXPLAIN; }
-^{Spaces}"/IMP"{Alpha}*{Space}+  { LLDBUG_PRL1("[IMP]"); BEGIN S_IMPORT; }
+^{Spaces}"/HIN"{Alpha}*{Spaces}  { LLDBUG_PRL1("[HIN]"); 
+                               /*    start_mode(MODE_HINT, "");*/
+                                   if (!HINTflag) {
+                                     start_streams(HINT_DEST,1);
+                                     HINTflag=-1;
+                                   }
+                                   change_destination(HINT_DEST);
+				   BEGIN S_HINT; 
+                                 }
+^{Spaces}"/EXP"{Alpha}*{Spaces}  { 
+                                   if (!EXPflag) {
+                                     start_streams(EXP_DEST,1);
+                                     EXPflag=-1;
+                                   }
+                                   change_destination(EXP_DEST);
+                                   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]");  
                                     if ( (LexiProblem_p !=NULL) && 
 					 (LexiProblem_p->question != NULL) && 
@@ -409,7 +454,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 && 
@@ -419,95 +464,143 @@ 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}"/ENDWHILE"([^\n])*          { long int  file_pos;       
-                                int   top_item, input_idx;
-                                LLDBUG_PRL2("[ENDWHILE While_idx=<%d>]\n",While_idx);
-                                
-                                top_item = While_idx - 1;
-                                if( top_item < 0 ) { /* strange things must have happened here! */
-                                  
-                                } else {
-                                  input_idx = WhileStack[top_item].input_idx;
-                                  file_pos = WhileStack[top_item].pos_idx;
-                                  Current_line[input_idx] = WhileStack[top_item].line_idx;
-                                  Lexi_pos[input_idx] = 0;
-                                  fseek(Input_stream[input_idx],file_pos,SEEK_SET);
-                                  fgets(Lexi_buf[input_idx],LEX_BUFLEN-1,Input_stream[input_idx]);
-                                  While_idx--;
-                                }
+^{Spaces}"/ANS"               { LLDBUG_PRL2("[ANS(%s)]",yytext); 
+                                Pcount = 0; 
+                                BEGIN S_ANSWER; 
+                                end_mode();
+				start_mode(MODE_ANSWER,NULL);
+                                send("]\n",IFcount);
+                                IFcount--;
+				end_mode_stream(DEFAULT_DEST,0);
+				for(i=0;i");
+				send_stream(1,"}");
+				if (IFcount == 0) {
+				  if (watch_mode[current_dest][1]) {
+				    end_streams(DEFAULT_DEST,1);
+ 				  } else {
+				    end_streams(DEFAULT_DEST,0);
+				  }
+                                  change_destination(DEFAULT_DEST);
+				}
+				delete_cache();
                                 BEGIN S_TEXT;
                               }
 "/WHILE"                      |
-^{Spaces}"/WHILE"             { long int file_pos;
-                                int      leng;
-                                LLDBUG_PRL2("[WHILE While_idx=<%d>]\n",While_idx);
-                                leng = strlen(Lexi_buf[Input_idx]);  /* length of current line */
-                                /* <-- because we use fgets() to read input, 
-                                       thus ftell() will give the starting position of next line */
-                                WhileStack[While_idx].input_idx = Input_idx;
-                                file_pos = ftell(Input_stream[Input_idx]);
-                                file_pos -= leng;  /* calibrate the current line length */
-                                WhileStack[While_idx].pos_idx = file_pos;  /* begin of current line */
-                                WhileStack[While_idx].line_idx = Current_line[Input_idx];
-                                While_idx++;  /* advance the stack pointer */
-                                
-                                BEGIN S_TRUE_FALSE_STMT; RETURN(CAPA_WHILE); 
-                                
+^{Spaces}"/WHILE"             { 
+                                int      i;
+                                LLDBUG_PRL2("[WHILE While_idx=<%d>]\n",IFcount);
+                                IFcount++;  /* advance the stack pointer */
+                                BEGIN S_TRUE_FALSE_STMT;
+				if ( IFcount == 1) {
+ 				  start_streams(DEFAULT_DEST, 2);
+                                  change_destination(DEFAULT_DEST);
+				  watch_mode[current_dest][1]=1;
+				}
+				end_mode_stream(DEFAULT_DEST, 0);
+				start_mode_stream(DEFAULT_DEST,1,MODE_SCRIPT,NULL);
+				for(i=1;i]",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(DEFAULT_DEST, 2);
+                                  change_destination(DEFAULT_DEST);
+				  watch_mode[current_dest][1]=1;
+				}
+				end_mode_stream(DEFAULT_DEST, 0);
+				start_mode_stream(DEFAULT_DEST,1,MODE_SCRIPT,NULL);
+				for(i=1;i]\n",IFcount);
+				end_mode_stream(DEFAULT_DEST,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(DEFAULT_DEST,0);
+				for(i=0;i");
+				send_stream(1,"}");
+				if (IFcount == 0) {
+				  if (watch_mode[current_dest][1]) {
+				    end_streams(DEFAULT_DEST,1);
+ 				  } else {
+				    end_streams(DEFAULT_DEST,0);
+				  }
+                                  change_destination(DEFAULT_DEST);
+				}
+				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<]");
                                 init_funcstack();
                                 Pcount = 0; BEGIN S_VARIABLE; 
-                                RETURN(CAPA_VAR); 
+				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 */ 
-                                RETURN(EoL); }
+                                send("
\n"); } [\\]{Space}*{EndLine} { LLDBUG_PR2("[\\EoL continue](%s)",yytext); /* continuation on next line */ } -^{Spaces}"//"[^\n]*{EndLine} { LLDBUG_PRL2("[COMMENT<%s>]\n",yytext); - send("\n"); - send(&yytext[2]); - BEGIN S_COMMENT; +^{Spaces}"//"[^\n]*$ { LLDBUG_PRL2("[COMMENT<%s>]\n",yytext); + start_mode(MODE_SCRIPT,NULL); + send("# %s\n",&yytext[2]); + BEGIN S_COMMENT; } + [^/\n\\]+$ | [/] | -[\\] { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); - yylval->s_str = strsave(yytext); +[\\] { start_mode(MODE_OUTTEXT,NULL); LLDBUG_PR2("[TEXT_LINE<%s>]",yytext); - RETURN(TEXT_LINE); + send(yytext); } ([^/\n])+[/] | ([^/\n])+[\\] { /* matches anything until a '/' or a '\' */ + start_mode(MODE_OUTTEXT,NULL); LLDBUG_PR2("[TEXT_LINE( )<%s>]",yytext); yyless(yyleng-1); /* push back the last char */ - yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); - yylval->s_str = strsave(yytext); - BEGIN S_TEXT; - RETURN(TEXT_LINE); + send(yytext); } <> { #ifdef AVOIDYYINPUT @@ -526,7 +619,7 @@ EndLine ([\r][\n]|[\n]) } } else { sprintf(warn_msg, - "at End-of-File, a /END is needed.\n"); + "at End-of-File, a /END is needed.\n"); capa_msg(MESSAGE_ERROR,warn_msg); } free_problems(LexiProblem_p); @@ -609,168 +702,186 @@ EndLine ([\r][\n]|[\n]) { [/][Dd][Ii][Ss]{Space}*[\(]{Space}* { yy_push_state(S_HINTEXLAINX); } [^/\n]+[/\\] { char *aptr = yytext; - int ii; - yyless(yyleng-1); - for(ii=0;ii{ {EndLine} { LLDBUG_PR1("[CR hint]"); - 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(HINT_LINE); + send("\n"); + change_destination(DEFAULT_DEST); + BEGIN S_TEXT; } } { {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"); + change_destination(DEFAULT_DEST); + 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; - } - } +{Alpha}{AlphaNum}* {send("${%s}",yytext);} {Space}+ { } [)] { yy_pop_state(); } } { -{FileName}{Space}* { parse_filename(yytext); BEGIN S_SKIP; } -{Identifier}{Space}* { parse_import_id(yytext); BEGIN S_SKIP; } +{FileName}{Space}* { char *endquote; + end_mode(); + start_mode(MODE_IMPORT,NULL); + /* Get rid of leading and trailing quotes */ + endquote = strrchr(yytext,'\"'); + *endquote = '\0'; + if (yytext[1] == '/') { + send("%s%s",import_prefix,&yytext[1]); + } else { + send("%s",&yytext[1]); + } + 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"); + /* Fill in Hints */ + if ( !is_dest_empty(HINT_DEST) ) { + send("\n\t\n\t"); + end_streams(HINT_DEST,0); + HINTflag=0; + send("\t\n\t\n\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); - /*yylval = find_identifier(yytext);*/ RETURN(IDENTIFIER); +{ +{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; - for(i=0;i < (yyleng-1); i++) { - if( yytext[i] == ' ' || yytext[i] == '\t' || - yytext[i] == 0 || yytext[i] == '(' ) break; - aline[i] = yytext[i]; - } - aline[i] = 0; - LLDBUG_PR3("[FUNCT<%s:%d>]",aline,Func_idx); - (FuncStack[Func_idx]).s_type = FUNCTION_ID; - (FuncStack[Func_idx]).s_name = strsave(aline); /* free it in parser() */ - Func_idx++; - yyless(yyleng-1); /* <-- push back '(' char */ - RETURN(FUNCTION_ID); +{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]; - int i; - for(i=0;i < (yyleng-1); i++) { - if( yytext[i] == ' ' || yytext[i] == '\t' || - yytext[i] == 0 || yytext[i] == '[' ) break; - aline[i] = yytext[i]; - } - aline[i] = 0; - LLDBUG_PR2("[ARRAY<%s>]",aline); +{Alpha}{AlphaNum}*{Space}*[\[] { + LLDBUG_PR2("[ARRAY<%s>]",yytext); - yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */ - yylval->s_name = strsave(aline); /* free it in parser() */ - yylval->s_type = ARRAY_ID; - - yyless(yyleng-1); /* <-- push back char '[' */ - RETURN(ARRAY_ID); + yyless(yyleng-1); /*<-- push back char '[' */ + if (dosend==1) send("$%s",yytext); + if (dosend==2) add_delayed("$%s",yytext); } {Number}*"\."{Number}*[Ee]"+"{Number}+ | {Number}*"\."{Number}*[Ee]{Number}+ | @@ -779,71 +890,128 @@ EndLine ([\r][\n]|[\n]) {Number}+[Ee]{Number}+ | {Number}+[Ee]"-"{Number}+ | {Number}+"\."{Number}* | -"\."{Number}+ { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */ - yylval->s_real = strtod(yytext, (char **) 0); - yylval->s_type = R_CONSTANT; - LLDBUG_PR2("[REAL<%s>]",yytext); - RETURN(R_CONSTANT); +"\."{Number}+ { LLDBUG_PR2("[REAL<%s>]",yytext); + if(dosend==1) send("%s",yytext); + if(dosend==2) add_delayed("%s",yytext); } -{Number}+ { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */ - yylval->s_int = strtol(yytext, (char **) 0, 0); - yylval->s_type= I_CONSTANT; - LLDBUG_PR2("[INT<%s>]",yytext); - RETURN(I_CONSTANT); +{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 '[']"); + if(dosend==1) send("%s",yytext); + if(dosend==2) add_delayed("%s",yytext); + } +[\]] { LLDBUG_PR1("[dis let ans map ']']"); + if(dosend==1) send("%s",yytext); + if(dosend==2) add_delayed("%s",yytext); } -[\(] { LLDBUG_PR1("[dis let ans map (]"); Pcount++; return(yytext[0]); } -[\[] { 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; - yy_push_state(S_STRING); + send("'"); + yy_push_state(S_STRING); } } -[:]{Number}+[EeFf] { char num[ONE_TWO_EIGHT], fmt[SMALL_LINE_BUFFER]; - int i; - LLDBUG_PR2("[FORMAT<%s>]",yytext); - for(i=0;is_type=FORMAT; - switch( yytext[yyleng-1] ) { - case 'e': sprintf(fmt,"%%.%de", i); - yylval->s_distype = E_FORMAT; break; - case 'E': sprintf(fmt,"%%.%dE", i); - yylval->s_distype = E_FORMAT; break; - case 'f': - case 'F': sprintf(fmt,"%%.%df", i); - yylval->s_distype = F_FORMAT; break; - } - yylval->s_str = strsave(fmt); - RETURN(FORMAT); +{ +[\"] { 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); + } +[:]{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; } -{Operator} { LLDBUG_PR2("[Op(%c) in VAR,TF_STMT,LET]",yytext[0]); return(yytext[0]); } +"==" { 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; + } + } +[%] {send("%%");} +{Operator} { LLDBUG_PR2("[Op(%c) in VAR,TF_STMT,LET]",yytext[0]); send(yytext); } } { -[\)] { LLDBUG_PR1("[)]"); Pcount--; if(Pcount == 0) BEGIN S_TEXT; return(yytext[0]); } +[\)] { LLDBUG_PR1("[)]"); + Pcount--; + if(Pcount == 0) { + BEGIN S_TEXT; + flush_delayed(); + } else { + send(yytext); + } + } [\\]{Space}*{EndLine} { LLDBUG_PR2("[\\EoL continue in S_VARIABLE (DIS?)](%s)",yytext); /* continuation on next line */ } -{EndLine} { LLDBUG_PR1("[EoL within /dis()]\n"); RETURN(EoL); } +{EndLine} { LLDBUG_PR1("[EoL within /dis()]\n"); } . { char warn_msg[WARN_MSG_LENGTH]; sprintf(warn_msg,"When use a VARIABLE, an unexpected char [%c] is encountered.\n",yytext[0]); capa_msg(MESSAGE_ERROR,warn_msg); @@ -851,62 +1019,101 @@ 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); } } { -[\\][\\] { char *aptr = yytext; - while( *aptr ) *Current_char_p++ = *aptr++; +[\\][\\] { /*char *aptr = yytext; + while( *aptr ) *Current_char_p++ = *aptr++;*/ + send(yytext); } -[\\][\"] { *Current_char_p++ = '"'; } +[\\][\"] { /**Current_char_p++ = '"';*/ send("\\\""); } [\\]{Space}*[\n] { LLDBUG_PR2("[\\CR continue in S_STRING](%s)",yytext); /* continuation on next line */ } [\"] { /* end of a string constant -- */ - yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); - *Current_char_p = '\0'; - yylval->s_str = strsave(String_buf); /* **** */ - yylval->s_type = S_CONSTANT; - /* printf("STRING:%s\n", String_buf); */ - LLDBUG_PR2("[%s\"END str]",String_buf); + send("'"); yy_pop_state(); - RETURN(S_CONSTANT); } + } +[%] { /*Escape percent signs so that vasprintf doesn't choke */ + send("%%"); + } +{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++;*/ + send(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]; - *Current_char_p = '\0'; 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++; +. { /*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--; return(yytext[0]); } +[\)] { LLDBUG_PR1("[) in LET]"); Pcount--;send(yytext); } { [^\n]+$ { } -{EndLine} { BEGIN S_TEXT; RETURN(EoL); } +{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; RETURN(EoL); } +{ +[^\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); } } @@ -915,41 +1122,10 @@ EndLine ([\r][\n]|[\n]) [\\]{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); @@ -976,22 +1152,16 @@ EndLine ([\r][\n]|[\n]) { ^{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; } @@ -1596,6 +1766,7 @@ int capa_eof() LexiProblem_p=NULL; /* printf("\nCAPA EOF\n"); fflush(stdout); */ } + end_mode(); return (0); #endif /*AVOIDYYINPUT*/ }