--- capa/capa51/pProj/capaLexerDef.flex 1999/12/07 19:10:47 1.5 +++ capa/capa51/pProj/capaLexerDef.flex 2006/09/05 19:52:16 1.13 @@ -1,3 +1,27 @@ +/* main CAPA lexer + Copyright (C) 1992-2000 Michigan State University + + The CAPA system 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. + + The CAPA system 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 the CAPA system; see the file COPYING. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + As a special exception, you have permission to link this program + with the TtH/TtM library and distribute executables, as long as you + follow the requirements of the GNU GPL in regard to all of the + software in the executable aside from TtH/TtM. +*/ + /*------------------------------------------------------------------------*/ /* capaLexerDef.flex created by Isaac Tsai Jul 15 1996 */ /* added /END(variable) */ @@ -28,9 +52,10 @@ #include /* access() */ #endif -#include "capaToken.h" /* from YACC -d capaGrammarDef.y */ +#define YYSTYPE Symbol* #include "capaCommon.h" /* capa_access() */ #include "capaParser.h" /* _symbol structure def */ +#include "capaToken.h" /* from YACC -d capaGrammarDef.y */ #include "lex_debug.h" /* defined RETURN(xxx) macro */ @@ -216,14 +241,14 @@ void newyy_input (char *buf,int *result, if ( Lexi_buf[Input_idx] == NULL ) { \ Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1; \ } else { \ - if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) { /* test if the line buffer is empty or at the end */ \ + if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx] ]) { /* test if the line buffer is empty or at the end */ \ out_of_char=1; \ } \ } \ if( out_of_char ) { \ if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ \ LIDBUG_PR2("<>\n",Input_idx); \ - if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx]] == '\0') ) { \ + if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx] ] == '\0') ) { \ LIDBUG_PR2("<>\n",Input_idx); \ fclose(Input_stream[Input_idx]); \ capa_mfree((char *)Lexi_buf[Input_idx]); \ @@ -279,10 +304,10 @@ void newyy_input (char *buf,int *result, first_run=0; \ yyin = Input_stream[Input_idx]; LIDBUG_PR1("<>\n"); \ } \ - if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) { /* test if the line buffer is empty or at the end */ \ + if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx] ]) { /* test if the line buffer is empty or at the end */ \ if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ \ LIDBUG_PR2("<>\n",Input_idx); \ - if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx]] == '\0') ) { \ + if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx] ] == '\0') ) { \ LIDBUG_PR2("<>\n",Input_idx); \ fclose(Input_stream[Input_idx]); \ Input_idx--; \ @@ -352,10 +377,10 @@ EndLine ([\r][\n]|[\n]) %k 10000 %p 10000 %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_RANDOMORDER S_VERB +%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_RANDOMORDER S_VERB %array @@ -708,6 +733,7 @@ EndLine ([\r][\n]|[\n]) [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); } @@ -849,7 +875,7 @@ EndLine ([\r][\n]|[\n]) } { -[\)] { LLDBUG_PR1("[) in TRUE_FALSE]"); Pcount--; if(Pcount == 0) BEGIN S_NEXT_LINE; return(yytext[0]); } +[\)] { 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]; @@ -949,7 +975,10 @@ EndLine ([\r][\n]|[\n]) [^\n]*$ { LLDBUG_PRL2("[SkipIF anything ]",IFcount); } } { -([.]*){EndLine} { /* this ignores everything until it hits an EoL */ BEGIN S_TEXT; } +([.]*){EndLine} { /* this ignores everything until it hits an EoL */ + LLDBUG_PRL2("[ skip \'%s\' until EoL]\n",yytext); + BEGIN S_TEXT; + } } { @@ -1095,7 +1124,7 @@ input() /* ARGUMENTS: startup=0; yyin = Input_stream[Input_idx]; } - if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) { + if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx] ]) { if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* EOF? */ /* no use in flex @@ -1526,8 +1555,9 @@ char* parser_status() void yyfatalerror(char*msg) { char warn_msg[WARN_MSG_LENGTH]; - sprintf(warn_msg,"Invalid character[%s]\n",yytext); + sprintf(warn_msg,"Invalid character[\'%s\']\n",yytext); capa_msg(MESSAGE_ERROR,warn_msg); + capa_msg(MESSAGE_ERROR,msg); } void yyerror(char* msg) { @@ -1552,7 +1582,7 @@ void newyy_input (char *buf,int *result, if ( Lexi_buf[Input_idx] == NULL ) { Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1; } else { - if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx]]) { + if (!Lexi_buf[Input_idx][Lexi_pos[Input_idx] ]) { /* test if the line buffer is empty or at the end */ out_of_char=1; } @@ -1561,7 +1591,7 @@ void newyy_input (char *buf,int *result, if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ LIDBUG_PR2("<>\n",Input_idx); - if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx]] == '\0') ) { + if( (Input_idx > 0) && ( Lexi_buf[Input_idx][Lexi_pos[Input_idx] ] == '\0') ) { LIDBUG_PR2("<>\n",Input_idx); fclose(Input_stream[Input_idx]); capa_mfree((char *)Lexi_buf[Input_idx]);