aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpieter2001-10-04 07:26:09 +0000
committerpieter2001-10-04 07:26:09 +0000
commitd8eeac8d26fbaad5a3e3edcbbd927d25506887d7 (patch)
tree93a4d7511b6ec746dcc37025244ae6643a8c5853
parentBug fixes: overloading error, changed the order of dictionaries (diff)
Context -> ScanContext
various small things like operators of the form ::> git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@822 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r--frontend/scanner.dcl6
-rw-r--r--frontend/scanner.icl44
2 files changed, 28 insertions, 22 deletions
diff --git a/frontend/scanner.dcl b/frontend/scanner.dcl
index b20e43f..47038ad 100644
--- a/frontend/scanner.dcl
+++ b/frontend/scanner.dcl
@@ -113,7 +113,7 @@ instance <<< FilePosition
| ExistsToken // E.
| ForAllToken // A.
-:: Context
+:: ScanContext
= GeneralContext
| TypeContext
| FunctionContext
@@ -129,13 +129,13 @@ instance getFilename ScanState
class tokenBack state :: !*state -> !*state
instance tokenBack ScanState
-class nextToken state :: !Context !*state -> (!Token, !*state)
+class nextToken state :: !ScanContext !*state -> (!Token, !*state)
instance nextToken ScanState
class currentToken state :: !*state -> (!Token, !*state)
instance currentToken ScanState
-class insertToken state :: !Token !Context !*state -> *state
+class insertToken state :: !Token !ScanContext !*state -> *state
instance insertToken ScanState
class replaceToken state :: !Token !*state -> *state
diff --git a/frontend/scanner.icl b/frontend/scanner.icl
index 7a5a204..2dcd002 100644
--- a/frontend/scanner.icl
+++ b/frontend/scanner.icl
@@ -97,7 +97,7 @@ ScanOptionNoNewOffsideForSeqLetBit:==4;
{ lt_position :: ! FilePosition // Start position of this token
, lt_index :: ! Int // The index in the current line
, lt_token :: ! Token // The token itself
- , lt_context :: ! Context // The context of the token
+ , lt_context :: ! ScanContext // The context of the token
}
:: Buffer x
@@ -200,13 +200,13 @@ ScanOptionNoNewOffsideForSeqLetBit:==4;
| ForAllToken // A.
-:: Context
+:: ScanContext
= GeneralContext
| TypeContext
| FunctionContext
| CodeContext
-instance == Context
+instance == ScanContext
where
(==) co1 co2 = equal_constructor co1 co2
@@ -283,7 +283,7 @@ where
# (index,stream) = getIndex stream
= (index,{input & inp_stream=stream})
-class nextToken state :: !Context !*state -> (!Token, !*state)
+class nextToken state :: !ScanContext !*state -> (!Token, !*state)
instance nextToken RScanState
where
@@ -397,7 +397,7 @@ where currentToken scanState=:{ss_tokenBuffer}
= (ErrorToken "dummy", scanState)
= ((head ss_tokenBuffer).lt_token, scanState)
-class insertToken state :: !Token !Context !*state -> *state
+class insertToken state :: !Token !ScanContext !*state -> *state
instance insertToken RScanState
where
@@ -572,7 +572,7 @@ SkipToEndOfLine input
| c==NewLineChar = input
= SkipToEndOfLine input
-Scan :: !Char !Input !Context -> (!Token, !Input)
+Scan :: !Char !Input !ScanContext -> (!Token, !Input)
Scan '(' input co = (OpenToken, input)
Scan ')' input co = (CloseToken, input)
Scan '{' input CodeContext = ScanCodeBlock input
@@ -720,14 +720,20 @@ Scan c0=:'=' input co
Scan c0=:':' input co
# (eof,c1, input) = ReadNormalChar input
| eof = (ColonToken, input)
- | c1 == ':' = (DoubleColonToken, input)
- | c1 <> '='
- | isSpecialChar c1 = ScanOperator 1 input [c1, c0] co
- = (ColonToken, charBack input)
- # (eof, c2, input) = ReadNormalChar input
- | eof = ScanOperator 1 input [c1, c0] co
- | c2 == '=' = (ColonDefinesToken, input)
+ | c1 == ':'
+ # (eof, c2, input) = ReadNormalChar input
+ | eof = (DoubleColonToken, input)
+ | isSpecialChar c2 && ~(c2=='!' || c2=='*') // for type rules and the like
+ = ScanOperator 2 input [c2, c1, c0] co
+ = (DoubleColonToken, charBack input)
+ | c1 == '='
+ # (eof, c2, input) = ReadNormalChar input
+ | eof = ScanOperator 1 input [c1, c0] co
+ | c2 == '=' = (ColonDefinesToken, input)
= ScanOperator 1 (charBack input) [c1, c0] co
+ // c1 <> '='
+ | isSpecialChar c1 = ScanOperator 1 input [c1, c0] co
+ = (ColonToken, charBack input)
Scan c0=:'\'' input co = ScanChar input [c0]
Scan c0=:'\"' input co = ScanString 0 [c0] input
@@ -748,7 +754,7 @@ Scan c input co
| isSpecialChar c = ScanOperator 0 input [c] co
= (ErrorToken ScanErrIllegal, input)
-possibleKeyToken :: !Token ![Char] !Context !Input -> (!Token, !Input)
+possibleKeyToken :: !Token ![Char] !ScanContext !Input -> (!Token, !Input)
possibleKeyToken token reversedPrefix context input
# (eof, c, input) = ReadNormalChar input
| eof = (token, input)
@@ -762,11 +768,11 @@ new_exp_char '{' = True
new_exp_char '/' = True // to handle end of comment symbol: */
new_exp_char c = isSpace c
-ScanIdentFast :: !Int !Input !Context -> (!Token, !Input)
+ScanIdentFast :: !Int !Input !ScanContext -> (!Token, !Input)
ScanIdentFast n input=:{inp_stream=OldLine i line stream,inp_pos} co
# end_i = ScanIdentCharsInString i line co
with
- ScanIdentCharsInString :: !Int !{#Char} !Context -> Int
+ ScanIdentCharsInString :: !Int !{#Char} !ScanContext -> Int
ScanIdentCharsInString i line co
| i<size line && IsIdentChar line.[i] co
= ScanIdentCharsInString (i+1) line co
@@ -775,14 +781,14 @@ ScanIdentFast n input=:{inp_stream=OldLine i line stream,inp_pos} co
# input = {input & inp_stream=OldLine end_i line stream,inp_pos=pos}
= CheckReserved co (line % (i-n,end_i-1)) input
-ScanOperator :: !Int !Input ![Char] !Context -> (!Token, !Input)
+ScanOperator :: !Int !Input ![Char] !ScanContext -> (!Token, !Input)
ScanOperator n input token co
# (eof, c, input) = ReadNormalChar input
| eof = CheckReserved co (revCharListToString n token) input
| isSpecialChar c = ScanOperator (n + 1) input [c:token] co
= CheckReserved co (revCharListToString n token) (charBack input)
-CheckReserved :: !Context !String !Input -> (!Token, !Input)
+CheckReserved :: !ScanContext !String !Input -> (!Token, !Input)
CheckReserved GeneralContext s i = CheckGeneralContext s i
CheckReserved TypeContext s i = CheckTypeContext s i
CheckReserved FunctionContext s i = CheckFunctContext s i
@@ -1144,7 +1150,7 @@ hexDigitToInt 'f' = 15
hexDigitToInt 'F' = 15
hexDigitToInt c = digitToInt c
-IsIdentChar :: !Char !Context -> Bool
+IsIdentChar :: !Char !ScanContext -> Bool
IsIdentChar c _ | isAlphanum c = True
IsIdentChar '_' _ = True
IsIdentChar '`' _ = True