diff options
| author | johnvg | 2010-05-25 12:44:57 +0000 | 
|---|---|---|
| committer | johnvg | 2010-05-25 12:44:57 +0000 | 
| commit | fa3dce2db92db9e0107e82204e4c3b5485ec2bbd (patch) | |
| tree | 7d2d936bd64b5b0e29f3aa49ae7726df3b9ffe30 /frontend/scanner.icl | |
| parent | allow shorted array and record updates after # or #! as: (diff) | |
scan 'ModuleName'.Symbol or 'ModuleName'. OperatorSymbol
as qualified identifiers
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1787 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'frontend/scanner.icl')
| -rw-r--r-- | frontend/scanner.icl | 131 | 
1 files changed, 118 insertions, 13 deletions
| diff --git a/frontend/scanner.icl b/frontend/scanner.icl index 7983ab3..8d671fb 100644 --- a/frontend/scanner.icl +++ b/frontend/scanner.icl @@ -374,10 +374,6 @@ where  												ss_tokenBuffer,  							ss_offsides=ss_offsides,	ss_scanOptions=ss_scanOptions  						}	 -->> (token,pos) -	where -		mark_position {inp_stream=input=:(OldLine i _ _),inp_filename,inp_pos,inp_tabsize} -			= {inp_stream=input, inp_filename=inp_filename, inp_pos={inp_pos &fp_col=1}, inp_tabsize=inp_tabsize} -		mark_poistion input = input  	nextToken _ _ = abort "Scanner: Error in nextToken"  class tokenBack state :: !*state -> *state @@ -580,13 +576,11 @@ Scan '(' input co			= (OpenToken, input)  Scan ')' input co			= (CloseToken, input)  Scan '{' input CodeContext	= ScanCodeBlock input  //Scan '{' input co			= (CurlyOpenToken, input) -// AA ...  Scan c0=:'{' input co  	# (eof, c1, input)		= ReadNormalChar input  	| eof					= (CurlyOpenToken, input)  	| c1 == '|'				= (GenericOpenToken, input)  							= (CurlyOpenToken, charBack input) -// ... AA  Scan '}' input co			= (CurlyCloseToken, input)  Scan '[' input co			= (SquareOpenToken, input)  Scan ']' input co			= (SquareCloseToken, input) @@ -737,7 +731,7 @@ Scan c0=:':' input co  	// c1 <> '='  	| isSpecialChar c1		= ScanOperator 1 input [c1, c0] co  							= (ColonToken, charBack input) -Scan c0=:'\'' input co		= ScanChar input [c0] +Scan '\'' input co			= ScanChar input  Scan c0=:'\"' input co		= ScanString 0 [c0] input  Scan 'E' input TypeContext @@ -1055,13 +1049,13 @@ ScanOctNumeral n input  	| isOctDigit c			= ScanOctNumeral (n*8+digitToInt c) input  							= (IntToken (toString n), charBack input) -ScanChar :: !Input ![Char] -> (!Token, !Input) -ScanChar input chars +ScanChar :: !Input -> (!Token, !Input) +ScanChar input  	# (eof, c, input)		= ReadChar input // PK: was ReadNormalChar input  	| eof					= (ErrorToken "End of file inside Char denotation", input) -	| '\'' == c				= (CharListToken "", input) -	| '\\' == c				= ScanBSChar 0 chars input ScanEndOfChar -							= ScanEndOfChar 1 [c: chars] input +	| c=='\''				= (CharListToken "", input) +	| c=='\\'				= ScanBSChar 0 ['\''] input ScanEndOfChar +							= ScanEndOfNoBSChar c input  ScanBSChar :: !Int ![Char] !Input (Int [Char] Input -> (!Token, !Input)) -> (!Token, !Input)  ScanBSChar n chars input cont @@ -1129,7 +1123,118 @@ ScanEndOfChar n chars input  	| '\'' == c				= (CharToken (revCharListToString (n + 1) [c:chars]), input)  	| '\\' == c				= ScanBSChar n chars input ScanCharList  							= ScanCharList (n+1) [c:chars] input -//							= (ErrorToken ScanErrCharErr, input) + +ScanEndOfNoBSChar :: !Char !Input -> (!Token, !Input) +ScanEndOfNoBSChar c1 input +	# (eof, c, input)		= ReadChar input +	| eof					= (ErrorToken "End of file inside char denotation", input) +	| c=='\'' +							| is_ident_char c1 +								= qualified_ident_or_CharToken c1 input							 +								= (CharToken {'\'',c1,'\''}, input) +	| c=='\\'				= ScanBSChar 1 [c1,'\''] input ScanCharList +							= scan_CharList_or_qualified_ident c1 c input +where +	qualified_ident_or_CharToken :: !Char !Input -> (!Token,!Input) +	qualified_ident_or_CharToken c input=:{inp_stream=OldLine i line stream,inp_pos} +		| i+1<size line && line.[i]=='.' +			# c=line.[i+1] +			| is_ident_char c +				# end_i = scan_ident_chars_in_string (i+2) line +				  ident_name = line % (i+1,end_i-1) +				  pos = {inp_pos & fp_col = inp_pos.fp_col + (end_i-i)} +				  input =  {input & inp_stream=OldLine end_i line stream,inp_pos=pos} +				= (QualifiedIdentToken {c} ident_name,input) +			| c==' ' && i+2<size line && isSpecialChar line.[i+2] +				# end_i = scan_special_chars_in_string (i+3) line +				  ident_name = line % (i+1,end_i-1) +				  pos = {inp_pos & fp_col = inp_pos.fp_col + (end_i-i)} +				  input =  {input & inp_stream=OldLine end_i line stream,inp_pos=pos} +				= (QualifiedIdentToken {c} ident_name,input) +				= scan_char c input +			= scan_char c input +	qualified_ident_or_CharToken c input +		= scan_char c input + +	scan_CharList_or_qualified_ident :: !Char !Char !Input -> (!Token, !Input) +	scan_CharList_or_qualified_ident c1 c2 input=:{inp_stream=OldLine i line _} +		| i>=3 && is_ident_char c1 +			| is_ident_char c2 +				# after_module_name_i = scan_rest_of_module_name_in_string i line +				| after_module_name_i+2<size line && line.[after_module_name_i]=='\'' && line.[after_module_name_i+1]=='.' +					# c=line.[after_module_name_i+2] +					| is_ident_char c +						= qualified_ident after_module_name_i input +					| c==' ' && after_module_name_i+3<size line && isSpecialChar line.[after_module_name_i+3] +						= qualified_special_ident after_module_name_i input +						= scan_char_list c2 c1 input +					= scan_char_list c2 c1 input +			| c2=='.' && i<size line && is_ident_char line.[i] +				# after_module_name_i = scan_rest_of_module_name_in_string (i+1) line +				| after_module_name_i+2<size line && line.[after_module_name_i]=='\'' && line.[after_module_name_i+1]=='.' +					# c=line.[after_module_name_i+2] +					| is_ident_char c +						= qualified_ident after_module_name_i input +					| c==' ' && after_module_name_i+3<size line && isSpecialChar line.[after_module_name_i+3] +						= qualified_special_ident after_module_name_i input +						= scan_char_list c2 c1 input +					= scan_char_list c2 c1 input +				= scan_char_list c2 c1 input +			= scan_char_list c2 c1 input +	where +		scan_rest_of_module_name_in_string :: !Int !{#Char} -> Int +		scan_rest_of_module_name_in_string i s +			| i<size s +				# c=s.[i] +				| is_ident_char c +					= scan_rest_of_module_name_in_string (i+1) s +				| c=='.' && i+1<size s && is_ident_char s.[i+1] +					= scan_rest_of_module_name_in_string (i+2) s +					= i +				= i + +		qualified_ident :: !Int !Input -> (!Token,!Input) +		qualified_ident after_module_name_i input=:{inp_stream=OldLine i line stream,inp_pos} +			# module_name = line % (i-2,after_module_name_i-1) +			  after_ident_i = scan_ident_chars_in_string (after_module_name_i+3) line +			  ident_name = line % (after_module_name_i+2,after_ident_i-1) +			  pos = {inp_pos & fp_col = inp_pos.fp_col + (after_ident_i-i)} +			  input =  {input & inp_stream=OldLine after_ident_i line stream,inp_pos=pos} +			= (QualifiedIdentToken module_name ident_name,input) + +		qualified_special_ident :: !Int !Input -> (!Token,!Input) +		qualified_special_ident after_module_name_i input=:{inp_stream=OldLine i line stream,inp_pos} +			# module_name = line % (i-2,after_module_name_i-1) +			  after_ident_i = scan_special_chars_in_string (after_module_name_i+4) line +			  ident_name = line % (after_module_name_i+3,after_ident_i-1) +			  pos = {inp_pos & fp_col = inp_pos.fp_col + (after_ident_i-i)} +			  input =  {input & inp_stream=OldLine after_ident_i line stream,inp_pos=pos} +			= (QualifiedIdentToken module_name ident_name,input) + +		scan_char_list :: !Char !Char !Input -> (!Token, !Input) +		scan_char_list c2 c1 input +			= ScanCharList 2 [c2,c1,'\''] input +	scan_CharList_or_qualified_ident c1 c2 input +		= ScanCharList 2 [c2,c1,'\''] input + +	scan_ident_chars_in_string :: !Int !{#Char} -> Int +	scan_ident_chars_in_string i line +		| i<size line && is_ident_char line.[i] +			= scan_ident_chars_in_string (i+1) line +			= i + +	scan_special_chars_in_string :: !Int !{#Char} -> Int +	scan_special_chars_in_string i line +		| i<size line && isSpecialChar line.[i] +			= scan_special_chars_in_string (i+1) line +			= i + +	scan_char :: !Char !Input -> (!Token, !Input) +	scan_char c input +		= (CharToken {'\'',c,'\''}, input) + +	is_ident_char c +		= isAlphanum c || c=='_' || c=='`'  ScanCharList :: !Int ![Char] !Input -> (!Token, !Input)  ScanCharList n chars input | 
