1-
2-
3-
4-
5-
6-
7-
8-
91using SL . Core . Api ;
102using SL . Core . Common ;
113
124namespace SL . Core . Lexing ;
135
146public class Lexer
157{
16- private CharIterator _iterator ;
17- private Dictionary < string , ITokenHandler > _handlers ;
18- private HashSet < string > _ignores ;
8+ private readonly CharIterator _iterator ;
9+ private readonly Dictionary < string , ITokenHandler > _handlers ;
10+ private readonly HashSet < string > _ignores ;
1911
2012 public Lexer ( CharIterator iterator ,
21- Dictionary < string , ITokenHandler > handlers ,
22- HashSet < string > ignores )
13+ Dictionary < string , ITokenHandler > handlers ,
14+ HashSet < string > ignores )
2315 {
2416 _iterator = iterator ;
2517 _handlers = handlers ;
@@ -57,7 +49,7 @@ public async Task<Token> Lex(CancellationToken ctx)
5749 var nextSymbol = _iterator . Peek ( 1 ) . ToString ( ) ;
5850 if ( _handlers . ContainsKey ( nextSymbol ) || _ignores . Contains ( nextSymbol ) )
5951 {
60- return new Token ( TokenType . LITERRAL , symbol , _iterator . Position ( ) ) ;
52+ return new Token ( TokenType . IDENTIFIER , symbol , _iterator . Position ( ) ) ;
6153 }
6254
6355 _iterator . Advance ( ) ;
@@ -78,10 +70,42 @@ public async Task<Token> Lex(CancellationToken ctx)
7870 do
7971 {
8072 token = await Lex ( ctx ) ;
73+ if ( token . Type == TokenType . IGNORED )
74+ {
75+ continue ;
76+ }
77+
8178 tokens . Add ( token ) ;
82- }
83- while ( token . Type != TokenType . END_OF_FILE && token . Type != TokenType . BAD_TOKEN ) ;
79+ } while ( ! ctx . IsCancellationRequested &&
80+ ( token . Type != TokenType . END_OF_FILE && token . Type != TokenType . BAD_TOKEN ) ) ;
81+
82+ var cleared = new List < Token > ( ) ;
83+ for ( var i = 1 ; i < tokens . Count ( ) ; i ++ )
84+ {
85+ var one = tokens [ i - 1 ] ;
86+ var two = tokens [ i ] ;
8487
85- return tokens ;
88+ var value = one . Value + two . Value ;
89+ if ( _handlers . ContainsKey ( value ) )
90+ {
91+ var handler = _handlers [ value ] ;
92+ var tokenaa = await handler . Handle ( value , _iterator , ctx ) ;
93+ cleared . Add ( tokenaa ) ;
94+ i += 1 ;
95+ continue ;
96+ }
97+ else
98+ {
99+ cleared . Add ( one ) ;
100+ }
101+ }
102+
103+
104+ return cleared ;
105+ }
106+
107+ public async Task < TokenIterator > LexAllToInterator ( CancellationToken ctx = new CancellationToken ( ) )
108+ {
109+ return new TokenIterator ( await LexAll ( ctx ) , Token . EndOfFile ( null ) , ctx ) ;
86110 }
87111}
0 commit comments