--- loncom/homework/CAPA-converter/capaLexerDef.flex 2000/04/12 20:06:16 1.1 +++ loncom/homework/CAPA-converter/capaLexerDef.flex 2000/05/15 20:33:33 1.3 @@ -336,6 +336,7 @@ void newyy_input (char *buf,int *result, #endif int capa_eof(); + %} Alpha [a-zA-Z_] @@ -378,17 +379,19 @@ 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",yytext); + } +[^\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); @@ -397,8 +400,13 @@ EndLine ([\r][\n]|[\n]) Dynamic_buf[0] = '\0'; BEGIN S_VERB; } -^{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}"/HIN"{Alpha}*{Spaces} { LLDBUG_PRL1("[HIN]"); + start_mode(MODE_BLOCK, + "condition=\"&hinton\""); + 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}"/END" { LLDBUG_PRL1("[END]"); if ( (LexiProblem_p !=NULL) && @@ -480,34 +488,34 @@ EndLine ([\r][\n]|[\n]) 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_COMMENT,NULL); + send("%s\n",yytext); + BEGIN S_COMMENT; } + [^/\n\\]+$ | [/] | -[\\] { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); +[\\] { 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); + //RETURN(TEXT_LINE); } ([^/\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 +534,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); @@ -612,27 +620,20 @@ EndLine ([\r][\n]|[\n]) 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"); + BEGIN S_TEXT; } } { @@ -681,14 +682,15 @@ EndLine ([\r][\n]|[\n]) } break; } + printf("FIXME!Hint: %s\n",yytext); } {Space}+ { } [)] { yy_pop_state(); } } { -{FileName}{Space}* { parse_filename(yytext); BEGIN S_SKIP; } -{Identifier}{Space}* { parse_import_id(yytext); BEGIN S_SKIP; } +{FileName}{Space}* { end_mode();send("%s\n",yytext); BEGIN S_SKIP; } +{Identifier}{Space}* { end_mode();send("$%s\n",yytext); BEGIN S_SKIP; } } { @@ -737,23 +739,13 @@ EndLine ([\r][\n]|[\n]) { {Alpha}{AlphaNum}* { LLDBUG_PR2("[ID<%s>]",yytext);LLDBUG_PR2("[SYMB CNT=<%d>]", Symb_count); - /*yylval = find_identifier(yytext);*/ RETURN(IDENTIFIER); +send("$%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); + send("&%s",yytext); + Pcount++; } {Alpha}{AlphaNum}*{Space}*[\[] { char aline[MAX_FUNC_NAME]; int i; @@ -779,50 +771,31 @@ 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; +"\."{Number}+ { LLDBUG_PR2("[REAL<%s>]",yytext); - RETURN(R_CONSTANT); + send(yytext); } -{Number}+ { yylval = (Symbol *) capa_malloc(1, sizeof(Symbol)); /* *** */ - yylval->s_int = strtol(yytext, (char **) 0, 0); - yylval->s_type= I_CONSTANT; +{Number}+ { LLDBUG_PR2("[INT<%s>]",yytext); - RETURN(I_CONSTANT); + send(yytext); } -[\(] { LLDBUG_PR1("[dis let ans map (]"); Pcount++; return(yytext[0]); } +[\(] { 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\" ]"); 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); +[:]{Number}+[EeFf] { + end_delayed(); + send("&format("); + flush_delayed(); + send(",\"%s\")",yytext+1); } { @@ -835,15 +808,23 @@ EndLine ([\r][\n]|[\n]) "&&" { 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]); } +{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); @@ -861,43 +842,39 @@ EndLine ([\r][\n]|[\n]) } { -[\\][\\] { 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); } + } {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++;*/ + send(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); } +{EndLine} { LLDBUG_PR1("[EoL END let ans map]\n"); if(Pcount == 0) BEGIN S_TEXT; send(yytext); } } {