1+ #include " Tokenizer.h"
2+
3+ namespace FPL ::Tokenizer {
4+ std::vector<Token> TokenBuilder::ParseToken (const std::string &contentFile) {
5+ std::vector<Token> AllTokens;
6+ Token currentToken;
7+
8+ currentToken.TokenLineNumber = 1 ;
9+
10+ for (auto const &element: contentFile) {
11+ if (currentToken.TokenType == STRING_ESCAPE_SEQUENCE) {
12+ switch (element) {
13+ case ' n' :
14+ currentToken.TokenText .append (1 , ' \n ' );
15+ break ;
16+ case ' r' :
17+ currentToken.TokenText .append (1 , ' \r ' );
18+ break ;
19+ case ' t' :
20+ currentToken.TokenText .append (1 , ' \t ' );
21+ break ;
22+ case ' \\ ' :
23+ currentToken.TokenText .append (1 , ' \\ ' );
24+ break ;
25+ default :
26+ throw std::runtime_error (std::string (" unknown escape sequence: \\ " ) + std::string (1 , element) +
27+ " in string on line " + currentToken.TokenText + " ." );
28+ }
29+ currentToken.TokenType = CHAINE_LITTERAL;
30+ continue ;
31+ } else if (currentToken.TokenType == PEUTETRE_COMMENT && element != ' /' ) {
32+ currentToken.TokenType = OPERATEUR;
33+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
34+ continue ;
35+ }
36+
37+ switch (element) {
38+ case ' 0' :
39+ case ' 1' :
40+ case ' 2' :
41+ case ' 3' :
42+ case ' 4' :
43+ case ' 5' :
44+ case ' 6' :
45+ case ' 7' :
46+ case ' 8' :
47+ case ' 9' :
48+ if (currentToken.TokenType == ESPACE_VIDE) {
49+ currentToken.TokenType = ENTIER;
50+ currentToken.TokenText .append (1 , element);
51+ } else if (currentToken.TokenType == PEUTETRE_DECIMAL) {
52+ currentToken.TokenType = DECIMAL;
53+ currentToken.TokenText .append (1 , element);
54+ } else if (currentToken.TokenType == IDENTIFIANT) {
55+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
56+ currentToken.TokenType = ENTIER;
57+ currentToken.TokenText .append (1 , element);
58+ } else {
59+ currentToken.TokenText .append (1 , element);
60+ }
61+ break ;
62+
63+ case ' .' :
64+ if (currentToken.TokenType == ESPACE_VIDE) {
65+ currentToken.TokenType = PEUTETRE_DECIMAL;
66+ currentToken.TokenText .append (1 , element);
67+ } else if (currentToken.TokenType == ENTIER) {
68+ currentToken.TokenType = DECIMAL;
69+ currentToken.TokenText .append (1 , element);
70+ } else if (currentToken.TokenType == CHAINE_LITTERAL) {
71+ currentToken.TokenText .append (1 , element);
72+ } else {
73+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
74+ currentToken.TokenType = OPERATEUR;
75+ currentToken.TokenText .append (1 , element);
76+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
77+ }
78+ break ;
79+
80+ case ' {' :
81+ case ' }' :
82+ case ' (' :
83+ case ' )' :
84+ case ' ,' :
85+ case ' ;' :
86+ case ' -' :
87+ case ' +' :
88+ case ' *' :
89+ case ' =' :
90+ case ' :' :
91+ case ' <' :
92+ case ' >' :
93+ case ' [' :
94+ case ' ]' :
95+ if (currentToken.TokenType != CHAINE_LITTERAL) {
96+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
97+ currentToken.TokenType = OPERATEUR;
98+ currentToken.TokenText .append (1 , element);
99+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
100+ } else {
101+ currentToken.TokenText .append (1 , element);
102+ }
103+ break ;
104+
105+ case ' "' :
106+ if (currentToken.TokenType != CHAINE_LITTERAL) {
107+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
108+ currentToken.TokenType = CHAINE_LITTERAL;
109+ } else if (currentToken.TokenType == CHAINE_LITTERAL) {
110+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
111+ }
112+ break ;
113+
114+ case ' ' :
115+ case ' \t ' :
116+ if (currentToken.TokenType == CHAINE_LITTERAL || currentToken.TokenType == COMMENT) {
117+ currentToken.TokenText .append (1 , element);
118+ } else {
119+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
120+ }
121+ break ;
122+
123+ case ' \r ' :
124+ case ' \n ' :
125+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
126+ ++currentToken.TokenLineNumber ;
127+ break ;
128+
129+ case ' \\ ' :
130+ if (currentToken.TokenType == CHAINE_LITTERAL) {
131+ currentToken.TokenType = STRING_ESCAPE_SEQUENCE;
132+ } else {
133+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
134+ currentToken.TokenType = OPERATEUR;
135+ currentToken.TokenText .append (1 , element);
136+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
137+ }
138+ break ;
139+
140+ case ' /' :
141+ if (currentToken.TokenType == CHAINE_LITTERAL) {
142+ currentToken.TokenText .append (1 , element);
143+ } else if (currentToken.TokenType == PEUTETRE_COMMENT) {
144+ currentToken.TokenType = COMMENT;
145+ currentToken.TokenText .erase ();
146+ } else {
147+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
148+ currentToken.TokenType = PEUTETRE_COMMENT;
149+ currentToken.TokenText .append (1 , element);
150+ }
151+ break ;
152+
153+ default :
154+ if (currentToken.TokenType == ESPACE_VIDE || currentToken.TokenType == ENTIER || currentToken.TokenType == DECIMAL) {
155+ TokenBuilder::ParseEndToken (currentToken, AllTokens);
156+ currentToken.TokenType = IDENTIFIANT;
157+ currentToken.TokenText .append (1 , element);
158+ } else {
159+ currentToken.TokenText .append (1 , element);
160+ }
161+ break ;
162+ }
163+ }
164+ return AllTokens;
165+ }
166+
167+ void TokenBuilder::ParseEndToken (Token &token, std::vector<Token> &tokens) {
168+ if (token.TokenType == COMMENT) {
169+ // std::cout << "Commentaire ignoré : " << token.TokenText << std::endl;
170+ } else if (token.TokenType != ESPACE_VIDE) {
171+ tokens.push_back (token);
172+ }
173+
174+ if (token.TokenType == PEUTETRE_DECIMAL) {
175+ if (token.TokenText == " ." ) {
176+ token.TokenType = OPERATEUR;
177+ } else {
178+ token.TokenType = PEUTETRE_DECIMAL;
179+ }
180+ }
181+ token.TokenType = ESPACE_VIDE;
182+ token.TokenText .erase ();
183+ }
184+
185+ std::ostream &operator <<(std::ostream &flux, const Token &token) {
186+ flux << " (Token Flux: " << token.TokenText << " , " << FPL::Tokenizer::sAllTokenTypes [token.TokenType ] << " )" ;
187+ return flux;
188+ }
189+ }
0 commit comments