INCLUDE keyword now used for include files. USES *must* be first statement.

This commit is contained in:
mysticbbs 2012-09-04 07:57:07 -04:00
parent 762abd4e6e
commit 5c4f5db288
4 changed files with 55 additions and 42 deletions

View File

@ -4723,3 +4723,13 @@
similar to how it works in a Unix environment. This will help prevent similar to how it works in a Unix environment. This will help prevent
a person from accidentally logging into a node that is being used during a person from accidentally logging into a node that is being used during
a local login. a local login.
+ Mystic now sends IAC_DO_BINARY as part of the starting telnet negotiations
done by MIS. This will help fix some weird issues with Linux/OSX default
telnet command line client.
+ In MPL including a file has been changed to its own keyword as opposed to
minicing a compile directive:
Old: {$include myfile.mps}
New: include myfile.mps

View File

@ -60,7 +60,7 @@ Const
colEditPosBar = 9 + 1 * 16; colEditPosBar = 9 + 1 * 16;
Const Const
Keywords = 23; Keywords = 24;
Keyword : Array[1..Keywords] of String[9] = ( Keyword : Array[1..Keywords] of String[9] = (
( 'AND' ), ( 'AND' ),
( 'BEGIN' ), ( 'BEGIN' ),
@ -73,6 +73,7 @@ Const
( 'FOR' ), ( 'FOR' ),
( 'FUNCTION' ), ( 'FUNCTION' ),
( 'IF' ), ( 'IF' ),
( 'INCLUDE' ),
( 'NOT' ), ( 'NOT' ),
( 'OF' ), ( 'OF' ),
( 'OR' ), ( 'OR' ),

View File

@ -84,6 +84,7 @@ Type
LastCharPos : LongInt; LastCharPos : LongInt;
IdentStr : String; IdentStr : String;
AllowOutput : Boolean; AllowOutput : Boolean;
GotBlock : Boolean;
UpdateProc : TParserUpdateProc; UpdateProc : TParserUpdateProc;
UpdateInfo : TParserUpdateInfo; UpdateInfo : TParserUpdateInfo;
VarData : VarDataRec; VarData : VarDataRec;
@ -109,6 +110,7 @@ Type
Procedure PrevChar; Procedure PrevChar;
Function GetStr (Str: String; Forced, CheckSpace: Boolean) : Boolean; Function GetStr (Str: String; Forced, CheckSpace: Boolean) : Boolean;
Function GetIdent (Forced: Boolean) : Boolean; Function GetIdent (Forced: Boolean) : Boolean;
Function GetDirective : String;
Function IsEndOfLine : Boolean; Function IsEndOfLine : Boolean;
Function CurFilePos : LongInt; Function CurFilePos : LongInt;
Procedure SavePosition; Procedure SavePosition;
@ -439,7 +441,7 @@ Begin
CloseSourceFile; CloseSourceFile;
UpdateInfo := InFile[CurFile].SavedInfo; UpdateInfo := InFile[CurFile].SavedInfo;
LoadPosition; LoadPosition;
GetChar; // read the } of the include ? // GetChar; // read the } of the include ?
End Else End Else
Error (mpsEndOfFile, ''); Error (mpsEndOfFile, '');
@ -462,21 +464,22 @@ Begin
Result := Ch in [#10, #13]; Result := Ch in [#10, #13];
End; End;
Procedure TParserEngine.NextChar; Function TParserEngine.GetDirective : String;
Function GetDirective : String;
Begin Begin
Result := ''; Result := '';
Repeat Repeat
GetChar; GetChar;
If Ch = '}' Then Break;
If Ch in [#10, #13, '}'] Then Break;
Result := Result + LoCase(Ch); Result := Result + LoCase(Ch);
Until UpdateInfo.ErrorType <> 0; Until UpdateInfo.ErrorType <> 0;
Result := strStripB(Result, ' '); Result := strStripB(Result, ' ');
End; End;
Procedure TParserEngine.NextChar;
Var Var
BlockCount : Byte; BlockCount : Byte;
BlockStart : Char; BlockStart : Char;
@ -537,13 +540,6 @@ Begin
If Ch = '$' Then Begin If Ch = '$' Then Begin
If GetIdent(False) Then Begin If GetIdent(False) Then Begin
If IdentStr = 'include' Then Begin
Str := GetDirective;
SavePosition;
InFile[CurFile].SavedInfo := UpdateInfo;
OpenSourceFile(Str);
If UpdateInfo.ErrorType <> 0 Then Exit;
End Else
If IdentStr = 'syntax' Then Begin If IdentStr = 'syntax' Then Begin
Str := GetDirective; Str := GetDirective;
If Str = 'pascal' Then Begin If Str = 'pascal' Then Begin
@ -581,14 +577,6 @@ Begin
Case Ch of Case Ch of
'$' : If (BlockCount = 1) And GetIdent(False) Then Begin '$' : If (BlockCount = 1) And GetIdent(False) Then Begin
If IdentStr = 'include' Then Begin
Str := GetDirective;
SavePosition;
InFile[CurFile].SavedInfo := UpdateInfo;
OpenSourceFile(Str);
If UpdateInfo.ErrorType <> 0 Then Exit;
Break;
End Else
If IdentStr = 'syntax' Then Begin If IdentStr = 'syntax' Then Begin
Str := GetDirective; Str := GetDirective;
If Str = 'pascal' Then Begin If Str = 'pascal' Then Begin
@ -1785,11 +1773,6 @@ Begin
End; End;
End; End;
// problem w const is if include file is right after last const.. ie:
// const
// blah = 'hi';
// {$include blah.mps}
Procedure TParserEngine.DefineConst; Procedure TParserEngine.DefineConst;
Begin Begin
If CurConstNum = mplMaxConsts Then If CurConstNum = mplMaxConsts Then
@ -2657,6 +2640,7 @@ Var
GotOpen : Boolean; // make parsemode var to replace all these bools GotOpen : Boolean; // make parsemode var to replace all these bools
GotVar : Boolean; GotVar : Boolean;
GotConst : Boolean; GotConst : Boolean;
IncName : String;
Begin Begin
GotOpen := CheckBlock; GotOpen := CheckBlock;
GotVar := False; GotVar := False;
@ -2683,6 +2667,15 @@ Begin
// being lazy and not rewriting all the token parsing... that would // being lazy and not rewriting all the token parsing... that would
// speed up parsing... but meh its only the compiler who cares lol // speed up parsing... but meh its only the compiler who cares lol
If GetStr(tkw[wInclude], False, False) Then Begin
IncName := GetDirective;
SavePosition;
InFile[CurFile].SavedInfo := UpdateInfo;
OpenSourceFile(IncName);
End Else
If GetStr(tkw[wBlockOpen], False, False) Then Begin If GetStr(tkw[wBlockOpen], False, False) Then Begin
If GotOpen And Not OneLine Then Begin If GotOpen And Not OneLine Then Begin
PrevChar; PrevChar;
@ -2745,9 +2738,15 @@ Begin
If GetStr(tkw[wExit], False, False) Then If GetStr(tkw[wExit], False, False) Then
OutString (Char(opExit)) OutString (Char(opExit))
Else Else
If GetStr(tkw[wUses], False, False) Then If GetStr(tkw[wUses], False, False) Then Begin
StatementUses If GotBlock Then
Error(mpsSyntaxError, 'USES must be first statement')
Else Begin Else Begin
StatementUses;
GotBlock := False;
Continue;
End;
End Else Begin
NextChar; NextChar;
If Ch in chIdent1 Then Begin If Ch in chIdent1 Then Begin
@ -2766,6 +2765,8 @@ Begin
End Else End Else
Error (mpsSyntaxError, ''); Error (mpsSyntaxError, '');
End; End;
GotBlock := True;
Until (UpdateInfo.ErrorType <> 0) or OneLine; Until (UpdateInfo.ErrorType <> 0) or OneLine;
For Count := CurVarNum DownTo SavedVar + 1 Do For Count := CurVarNum DownTo SavedVar + 1 Do
@ -2859,6 +2860,7 @@ Begin
UsesMGROUP := False; UsesMGROUP := False;
UsesFBASE := False; UsesFBASE := False;
UsesFGROUP := False; UsesFGROUP := False;
GotBlock := False;
Assign (OutFile, JustFileName(FN) + mplExtExecute); Assign (OutFile, JustFileName(FN) + mplExtExecute);
ReWrite (OutFile, 1); ReWrite (OutFile, 1);

View File

@ -167,7 +167,7 @@ Type
wCaseOf, wNumRange, wType, wConst, wCaseOf, wNumRange, wType, wConst,
wBreak, wContinue, wUses, wExit, wBreak, wContinue, wUses, wExit,
wHexPrefix, wExpAnd, wExpOr, wExpXor, wHexPrefix, wExpAnd, wExpOr, wExpXor,
wExpShl, wExpShr); wExpShl, wExpShr, wInclude);
{$ENDIF} {$ENDIF}
@ -200,7 +200,7 @@ Const
'of', '..', 'type', 'const', 'of', '..', 'type', 'const',
'break', 'continue', 'uses', 'exit', 'break', 'continue', 'uses', 'exit',
'$', 'and', 'or', 'xor', '$', 'and', 'or', 'xor',
'shl', 'shr' 'shl', 'shr', 'include'
); );
wTokensIPLC : TTokenWordType = ( wTokensIPLC : TTokenWordType = (
@ -220,7 +220,7 @@ Const
'of', '..', 'type', 'const', 'of', '..', 'type', 'const',
'break', 'continue', 'uses', 'exit', 'break', 'continue', 'uses', 'exit',
'$', '&', '|', 'xor', '$', '&', '|', 'xor',
'<<', '>>' '<<', '>>', 'include'
); );
{$ENDIF} {$ENDIF}