* included in the distribution.
*
* $RCSfile: input.c,v $
- * $Revision: 1.15 $
- * $Date: 1999/12/01 11:50:34 $
+ * $Revision: 1.27 $
+ * $Date: 2000/04/06 00:36:12 $
* ------------------------------------------------------------------------*/
-#include "prelude.h"
+#include "hugsbasictypes.h"
#include "storage.h"
-#include "backend.h"
#include "connect.h"
-#include "command.h"
#include "errors.h"
-#include "link.h"
+
#include <ctype.h>
#if HAVE_GETDELIM_H
#include "getdelim.h"
#include <windows.h>
#endif
-#if IS_WIN32 || HUGS_FOR_WINDOWS
+#if IS_WIN32
#undef IN
#endif
* Local function prototypes:
* ------------------------------------------------------------------------*/
-static Void local initCharTab Args((Void));
-static Void local fileInput Args((String,Long));
-static Bool local literateMode Args((String));
-static Bool local linecmp Args((String,String));
-static Int local nextLine Args((Void));
-static Void local skip Args((Void));
-static Void local thisLineIs Args((Int));
-static Void local newlineSkip Args((Void));
-static Void local closeAnyInput Args((Void));
-
- Int yyparse Args((Void)); /* can't stop yacc making this */
+static Void local initCharTab ( Void );
+static Void local fileInput ( String,Long );
+static Bool local literateMode ( String );
+static Bool local linecmp ( String,String );
+static Int local nextLine ( Void );
+static Void local skip ( Void );
+static Void local thisLineIs ( Int );
+static Void local newlineSkip ( Void );
+static Void local closeAnyInput ( Void );
+
+ Int yyparse ( Void ); /* can't stop yacc making this */
/* public, but don't advertise */
/* it in a header file. */
-static Void local endToken Args((Void));
-static Text local readOperator Args((Void));
-static Text local readIdent Args((Void));
-static Cell local readRadixNumber Args((Int));
-static Cell local readNumber Args((Void));
-static Cell local readChar Args((Void));
-static Cell local readString Args((Void));
-static Void local saveStrChr Args((Char));
-static Cell local readAChar Args((Bool));
+static Void local endToken ( Void );
+static Text local readOperator ( Void );
+static Text local readIdent ( Void );
+static Cell local readRadixNumber ( Int );
+static Cell local readNumber ( Void );
+static Cell local readChar ( Void );
+static Cell local readString ( Void );
+static Void local saveStrChr ( Char );
+static Cell local readAChar ( Bool );
-static Bool local lazyReadMatches Args((String));
-static Cell local readEscapeChar Args((Bool));
-static Void local skipGap Args((Void));
-static Cell local readCtrlChar Args((Void));
-static Cell local readOctChar Args((Void));
-static Cell local readHexChar Args((Void));
-static Int local readHexDigit Args((Char));
-static Cell local readDecChar Args((Void));
+static Bool local lazyReadMatches ( String );
+static Cell local readEscapeChar ( Bool );
+static Void local skipGap ( Void );
+static Cell local readCtrlChar ( Void );
+static Cell local readOctChar ( Void );
+static Cell local readHexChar ( Void );
+static Int local readHexDigit ( Char );
+static Cell local readDecChar ( Void );
-static Void local goOffside Args((Int));
-static Void local unOffside Args((Void));
-static Bool local canUnOffside Args((Void));
+static Void local goOffside ( Int );
+static Void local unOffside ( Void );
+static Bool local canUnOffside ( Void );
-static Void local skipWhitespace Args((Void));
-static Int local yylex Args((Void));
-static Int local repeatLast Args((Void));
+static Void local skipWhitespace ( Void );
+static Int local yylex ( Void );
+static Int local repeatLast ( Void );
-static Void local parseInput Args((Int));
+static Cell local parseInput ( Int );
-static Bool local doesNotExceed Args((String,Int,Int));
-static Int local stringToInt Args((String,Int));
+static Bool local doesNotExceed ( String,Int,Int );
+static Int local stringToInt ( String,Int );
/* --------------------------------------------------------------------------
static Text textWildcard;
static Text textModule, textImport, textInterface, textInstImport;
-static Text textHiding, textQualified, textAsMod;
+static Text textHiding, textQualified, textAsMod, textPrivileged;
static Text textExport, textDynamic, textUUExport;
-static Text textUnsafe, textUUAll;
+static Text textUnsafe, textUUAll, textUUUsage;
Text textCcall; /* ccall */
Text textStdcall; /* stdcall */
Text textNum; /* Num */
+Text textPrelPrim; /* PrelPrim */
Text textPrelude; /* Prelude */
Text textPlus; /* (+) */
*
* At the lowest level of input, characters are read one at a time, with the
* current character held in c0 and the following (lookahead) character in
- * c1. The corrdinates of c0 within the file are held in (column,row).
+ * c1. The coordinates of c0 within the file are held in (column,row).
* The input stream is advanced by one character using the skip() function.
* ------------------------------------------------------------------------*/
closeAnyInput();
}
else if (reading==KEYBOARD) {
- allowBreak();
+ /* allowBreak(); */
if (c0=='\n')
c1 = EOF;
else {
c1 = nextConsoleChar();
-#if IS_WIN32 && !HUGS_FOR_WINDOWS
+#if IS_WIN32
Sleep(0);
#endif
/* On Win32, hitting ctrl-C causes the next getchar to
* fail - returning "-1" to indicate an error.
* This is one of the rare cases where "-1" does not mean EOF.
*/
- if (EOF == c1 && (!feof(stdin) || broken==TRUE)) {
+ if (EOF == c1 && (!feof(stdin) /* || broken==TRUE */)) {
c1 = ' ';
}
}
* - Otherwise, if no `{' follows the keywords WHERE/LET or OF, a SOFT `{'
* is inserted with the column number of the first token after the
* WHERE/LET/OF keyword.
- * - When a soft indentation is uppermost on the indetation stack with
+ * - When a soft indentation is uppermost on the indentation stack with
* column col' we insert:
* `}' in front of token with column<col' and pop indentation off stack,
* `;' in front of token with column==col'.
* Now try to identify token type:
* --------------------------------------------------------------------*/
+ if (readingInterface) {
+ if (c0 == '(' && c1 == '#') { skip(); skip(); return UTL; };
+ if (c0 == '#' && c1 == ')') { skip(); skip(); return UTR; };
+ }
+
switch (c0) {
case EOF : return 0; /* End of file/input */
if (it==textDlet && !haskell98) lookAhead(DLET);
#endif
if (it==textUUAll) return ALL;
+ if (it==textUUUsage) return UUUSAGE;
if (it==textRepeat && reading==KEYBOARD)
return repeatLast();
* main entry points to parser/lexer:
* ------------------------------------------------------------------------*/
-static Void local parseInput(startWith)/* Parse input with given first tok,*/
+static Cell local parseInput(startWith)/* Parse input with given first tok,*/
Int startWith; { /* determining whether to read a */
- firstToken = TRUE; /* script or an expression */
+ Cell final = NIL; /* script or an expression */
+ firstToken = TRUE;
firstTokenIs = startWith;
if (startWith==INTERFACE) {
offsideON = FALSE; readingInterface = TRUE;
ERRMSG(row) "Parser overflow" /* as all syntax errors are caught */
EEND; /* in the parser... */
}
- drop();
- if (!stackEmpty()) /* stack should now be empty */
- internal("parseInput");
-}
-#ifdef HSCRIPT
-static String memPrefix = "@mem@";
-static Int lenMemPrefix = 5; /* strlen(memPrefix)*/
+ if (startWith==SCRIPT) pop(); /* zap spurious closing } token */
+ final = pop();
-Void makeMemScript(mem,fname)
-String mem;
-String fname; {
- strcat(fname,memPrefix);
- itoa((int)mem, fname+strlen(fname), 10);
-}
-
-Bool isMemScript(fname)
-String fname; {
- return (strstr(fname,memPrefix) != NULL);
-}
-
-String memScriptString(fname)
-String fname; {
- String p = strstr(fname,memPrefix);
- if (p) {
- return (String)atoi(p+lenMemPrefix);
- } else {
- return NULL;
- }
-}
-
-Void parseScript(fname,len) /* Read a script, possibly from mem */
-String fname;
-Long len; {
- input(RESET);
- if (isMemScript(fname)) {
- char* s = memScriptString(fname);
- stringInput(s);
- } else {
- fileInput(fname,len);
- }
- parseInput(SCRIPT);
-}
-#else
-Void parseScript(nm,len) /* Read a script */
-String nm;
-Long len; { /* Used to set a target for reading */
- input(RESET);
- fileInput(nm,len);
- parseInput(SCRIPT);
+ if (!stackEmpty()) /* stack should now be empty */
+ internal("parseInput");
+ return final;
}
-#endif
Void parseExp() { /* Read an expression to evaluate */
parseInput(EXPR);
setLastExpr(inputExpr);
}
-
#if EXPLAIN_INSTANCE_RESOLUTION
Void parseContext() { /* Read a context to prove */
parseInput(CONTEXT);
}
#endif
-Void parseInterface(nm,len) /* Read a GHC interface file */
+Cell parseInterface(nm,len) /* Read a GHC interface file */
+String nm;
+Long len; { /* Used to set a target for reading */
+ input(RESET);
+ Printf("Reading interface \"%s\"\n", nm );
+ fileInput(nm,len);
+ return parseInput(INTERFACE);
+}
+
+Cell parseModule(nm,len) /* Read a module */
String nm;
Long len; { /* Used to set a target for reading */
input(RESET);
+ Printf("Reading source file \"%s\"\n", nm );
fileInput(nm,len);
- parseInput(INTERFACE);
+ return parseInput(SCRIPT);
}
Void input(what)
Int what; {
switch (what) {
- case INSTALL : initCharTab();
+ case POSTPREL: break;
+
+ case PREPREL : initCharTab();
textCase = findText("case");
textOfK = findText("of");
textData = findText("data");
textBang = findText("!");
textDot = findText(".");
textImplies = findText("=>");
+ textPrelPrim = findText("PrelPrim");
textPrelude = findText("Prelude");
textNum = findText("Num");
textModule = findText("module");
textWildcard = findText("_");
textAll = findText("forall");
textUUAll = findText("__forall");
+ textUUUsage = findText("__u");
varMinus = mkVar(textMinus);
varPlus = mkVar(textPlus);
varBang = mkVar(textBang);
instDefns = NIL;
selDefns = NIL;
genDefns = NIL;
- //primDefns = NIL;
unqualImports= NIL;
foreignImports= NIL;
foreignExports= NIL;
mark(instDefns);
mark(selDefns);
mark(genDefns);
- //mark(primDefns);
mark(unqualImports);
mark(foreignImports);
mark(foreignExports);