version 1.2, 1999/10/13 18:45:28
|
version 1.13, 2006/09/05 19:52:16
|
Line 1
|
Line 1
|
|
/* 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 */ |
/* capaLexerDef.flex created by Isaac Tsai Jul 15 1996 */ |
/* added /END(variable) */ |
/* added /END(variable) */ |
Line 28
|
Line 52
|
#include <unistd.h> /* access() */ |
#include <unistd.h> /* access() */ |
#endif |
#endif |
|
|
#include "capaToken.h" /* from YACC -d capaGrammarDef.y */ |
#define YYSTYPE Symbol* |
#include "capaCommon.h" /* capa_access() */ |
#include "capaCommon.h" /* capa_access() */ |
#include "capaParser.h" /* _symbol structure def */ |
#include "capaParser.h" /* _symbol structure def */ |
|
#include "capaToken.h" /* from YACC -d capaGrammarDef.y */ |
#include "lex_debug.h" /* defined RETURN(xxx) macro */ |
#include "lex_debug.h" /* defined RETURN(xxx) macro */ |
|
|
|
|
Line 216 void newyy_input (char *buf,int *result,
|
Line 241 void newyy_input (char *buf,int *result,
|
if ( Lexi_buf[Input_idx] == NULL ) { \ |
if ( Lexi_buf[Input_idx] == NULL ) { \ |
Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1; \ |
Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1; \ |
} else { \ |
} 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; \ |
out_of_char=1; \ |
} \ |
} \ |
} \ |
} \ |
if( out_of_char ) { \ |
if( out_of_char ) { \ |
if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ \ |
if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ \ |
LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\n",Input_idx); \ |
LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\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("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); \ |
LIDBUG_PR2("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); \ |
fclose(Input_stream[Input_idx]); \ |
fclose(Input_stream[Input_idx]); \ |
capa_mfree((char *)Lexi_buf[Input_idx]); \ |
capa_mfree((char *)Lexi_buf[Input_idx]); \ |
Line 279 void newyy_input (char *buf,int *result,
|
Line 304 void newyy_input (char *buf,int *result,
|
first_run=0; \ |
first_run=0; \ |
yyin = Input_stream[Input_idx]; LIDBUG_PR1("<<yy_input() startup>>\n"); \ |
yyin = Input_stream[Input_idx]; LIDBUG_PR1("<<yy_input() startup>>\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 */ \ |
if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { /* read in one line */ \ |
LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\n",Input_idx); \ |
LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\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("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); \ |
LIDBUG_PR2("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); \ |
fclose(Input_stream[Input_idx]); \ |
fclose(Input_stream[Input_idx]); \ |
Input_idx--; \ |
Input_idx--; \ |
Line 352 EndLine ([\r][\n]|[\n])
|
Line 377 EndLine ([\r][\n]|[\n])
|
%k 10000 |
%k 10000 |
%p 10000 |
%p 10000 |
%n 1000 |
%n 1000 |
%x S_COMMENT S_HINT S_HINTEXLAINX S_IMPORT S_EXPLAIN S_ENDX S_UNIT S_IGNORE |
%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_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_IF_SKIP S_WHILE_SKIP |
%x S_NEXT_LINE S_RANDOMORDER S_VERB |
%x S_NEXT_LINE S_RANDOMORDER S_VERB |
%array |
%array |
|
|
|
|
Line 708 EndLine ([\r][\n]|[\n])
|
Line 733 EndLine ([\r][\n]|[\n])
|
[Uu][Nn][Ii][Tt] | |
[Uu][Nn][Ii][Tt] | |
[Uu][Nn][Ii][Tt][Ss] { LLDBUG_PR1("[UNIT]"); RETURN(ANS_UNIT); } |
[Uu][Nn][Ii][Tt][Ss] { LLDBUG_PR1("[UNIT]"); RETURN(ANS_UNIT); } |
[Bb][Rr] { LLDBUG_PR1("[SHOW_BR]"); RETURN(ANS_SHOW_BR); } |
[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); } |
[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); } |
[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][Pp][Ll][Aa][Ii][Nn] { LLDBUG_PR1("[EXPLAIN]"); RETURN(ANS_EXPLAIN); } |
Line 789 EndLine ([\r][\n]|[\n])
|
Line 815 EndLine ([\r][\n]|[\n])
|
} |
} |
} |
} |
|
|
<S_VARIABLE,S_ANSWER>[:]{Number}+[EeFf] { char num[ONE_TWO_EIGHT], fmt[SIXTEEN]; |
<S_VARIABLE,S_ANSWER>[:]{Number}+[EeFf] { char num[ONE_TWO_EIGHT], fmt[SMALL_LINE_BUFFER]; |
int i; |
int i; |
LLDBUG_PR2("[FORMAT<%s>]",yytext); |
LLDBUG_PR2("[FORMAT<%s>]",yytext); |
for(i=0;i<yyleng-2;i++) { |
for(i=0;i<yyleng-2;i++) { |
Line 849 EndLine ([\r][\n]|[\n])
|
Line 875 EndLine ([\r][\n]|[\n])
|
} |
} |
|
|
<S_TRUE_FALSE_STMT>{ |
<S_TRUE_FALSE_STMT>{ |
[\)] { 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 */ } |
[\\]{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); } |
{EndLine} { LLDBUG_PR1("[EoL within /IF()]\n"); RETURN(EoL); } |
. { char warn_msg[WARN_MSG_LENGTH]; |
. { char warn_msg[WARN_MSG_LENGTH]; |
Line 949 EndLine ([\r][\n]|[\n])
|
Line 975 EndLine ([\r][\n]|[\n])
|
[^\n]*$ { LLDBUG_PRL2("[SkipIF anything <IFcount=%d>]",IFcount); } |
[^\n]*$ { LLDBUG_PRL2("[SkipIF anything <IFcount=%d>]",IFcount); } |
} |
} |
<S_NEXT_LINE>{ |
<S_NEXT_LINE>{ |
([.]*){EndLine} { /* this ignores everything until it hits an EoL */ BEGIN S_TEXT; } |
([.]*){EndLine} { /* this ignores everything until it hits an EoL */ |
|
LLDBUG_PRL2("[<S_NEXT_LINE> skip \'%s\' until EoL]\n",yytext); |
|
BEGIN S_TEXT; |
|
} |
} |
} |
|
|
<S_WHILE_SKIP>{ |
<S_WHILE_SKIP>{ |
Line 1095 input() /* ARGUMENTS:
|
Line 1124 input() /* ARGUMENTS:
|
startup=0; |
startup=0; |
yyin = Input_stream[Input_idx]; |
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) { |
if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { |
/* EOF? */ |
/* EOF? */ |
/* no use in flex |
/* no use in flex |
Line 1135 char *
|
Line 1164 char *
|
strsave(char *s) |
strsave(char *s) |
{ |
{ |
char *p; |
char *p; |
|
if (s==NULL) {return s;} |
p=capa_malloc(strlen(s)+1,1); |
p=capa_malloc(strlen(s)+1,1); |
strcpy(p,s); |
strcpy(p,s); |
return (p); |
return (p); |
Line 1194 capa_msg(int type, char *p)
|
Line 1224 capa_msg(int type, char *p)
|
} |
} |
warn_msg[idx]=0; |
warn_msg[idx]=0; |
append_error(warn_msg); append_error(p); |
append_error(warn_msg); append_error(p); |
break; |
break; |
case MESSAGE_WARN: |
case MESSAGE_WARN: |
default: |
default: |
sprintf(tmp_line,", Line %d: WARNING:", Current_line[Input_idx]); |
sprintf(tmp_line,", Line %d: WARNING:", Current_line[Input_idx]); |
Line 1525 char* parser_status()
|
Line 1555 char* parser_status()
|
void yyfatalerror(char*msg) |
void yyfatalerror(char*msg) |
{ |
{ |
char warn_msg[WARN_MSG_LENGTH]; |
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,warn_msg); |
|
capa_msg(MESSAGE_ERROR,msg); |
} |
} |
void yyerror(char* msg) |
void yyerror(char* msg) |
{ |
{ |
Line 1551 void newyy_input (char *buf,int *result,
|
Line 1582 void newyy_input (char *buf,int *result,
|
if ( Lexi_buf[Input_idx] == NULL ) { |
if ( Lexi_buf[Input_idx] == NULL ) { |
Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1; |
Lexi_buf[Input_idx] = (char *)capa_malloc(sizeof(char)*LEX_BUFLEN+1,1); out_of_char=1; |
} else { |
} 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 */ |
/* test if the line buffer is empty or at the end */ |
out_of_char=1; |
out_of_char=1; |
} |
} |
Line 1560 void newyy_input (char *buf,int *result,
|
Line 1591 void newyy_input (char *buf,int *result,
|
if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { |
if (fgets(Lexi_buf[Input_idx],LEX_BUFLEN-1,Input_stream[Input_idx])==NULL) { |
/* read in one line */ |
/* read in one line */ |
LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\n",Input_idx); |
LIDBUG_PR2("<<yy_input() fgets() returns NULL, input index=%d>>\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("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); |
LIDBUG_PR2("<<yy_input() close an input stream, input index=%d>>\n",Input_idx); |
fclose(Input_stream[Input_idx]); |
fclose(Input_stream[Input_idx]); |
capa_mfree((char *)Lexi_buf[Input_idx]); |
capa_mfree((char *)Lexi_buf[Input_idx]); |