public IEnumerable <Token> Tokenize(string source, bool ignoreWhitespace = false) { int index = 1; char[] delimiters = new char[] { ' ', '\n', '\r' }; List <string> splited = source.Split(delimiters, StringSplitOptions.RemoveEmptyEntries).ToList(); var i = 0; while (i < splited.Count) { TokenDefinition matchedDefinition = null; int matchLength = 0; //Pour chaque règle, on vérifie si le règle match avec la chaîne actuelle foreach (var rule in _definitions) { string strToTest = splited[i]; if (strToTest.Length > 1 && strToTest[strToTest.Length - 1].Equals(';')) { splited[i] = (splited[i].Substring(0, splited[i].Length - 1)); splited.Insert(i + 1, ";"); } var match = rule.Regex.Match(splited[i]); if (match.Success) { matchedDefinition = rule; matchLength = match.Length + 1; //Si c'est un terminaux on enlève 1, car il ny a pas d'espace entre le terminaux et la chaîne avant if (rule.Type == "Terminaux") { index--; matchLength--; } break; } } //Si aucun des regex ne match if (matchedDefinition == null) { FrmCompilateur frmTemp = (FrmCompilateur)FrmCompilateur; frmTemp.ShowError("Erreur à l'index " + index + ", châine en conflit : " + splited[i]); index += splited[i].Length + 1; } else { yield return(new Token(matchedDefinition.Type, splited[i], new TokenPosition(index))); } index += matchLength; i++; } yield return(new Token(EoF, null, new TokenPosition(index))); }
private void btnCompiler_Click(object sender, EventArgs e) { List <Token> tokenList = new List <Token>(); Dictionary <string, int> dictTableSymbole = new Dictionary <string, int>(); dictTableSymbole.Add("int", 4); dictTableSymbole.Add("float", 4); dictTableSymbole.Add("string", 2); // sera multipliée par la longueur de la string dictTableSymbole.Add("char", 2); dictTableSymbole.Add("bool", 1); // Ajout des définitions dans le Lexer FrmCompilateur frmCompilateur = this; var lexer = new Lexer(frmCompilateur); lexer.AddDefinition(new TokenDefinition(@"(^int$|^float$|^char$|^string$|^bool$)", "Declaration")); lexer.AddDefinition(new TokenDefinition(@"^if$", "Condition")); lexer.AddDefinition(new TokenDefinition(@"^for$", "Boucle")); lexer.AddDefinition(new TokenDefinition(@"(^true$|^false$|^TRUE$|^FALSE$)", "Booleen")); lexer.AddDefinition(new TokenDefinition(@"^==$|^!=$|^<$|^>$|^=$", "Operateur")); lexer.AddDefinition(new TokenDefinition(@"^[0-9]+$", "Entier")); lexer.AddDefinition(new TokenDefinition(@"^[-+]?([0-9]+|[0-9]*\.[0-9]+)$", "Reel")); lexer.AddDefinition(new TokenDefinition(@"^\"".*\""$", "Chaine de caracteres")); lexer.AddDefinition(new TokenDefinition(@"^'\.?'$", "Caractere")); lexer.AddDefinition(new TokenDefinition(@"(^;$|^\($|^\)$|^\{$|^\}$)", "Terminaux")); lexer.AddDefinition(new TokenDefinition(@"^[a-zA-Z]\w*[a-zA-Z]$|^[a-zA-Z]$", "Identificateur")); // Affichage de l'analyse lexicale foreach (var token in lexer.Tokenize(fileContent, true)) { lbErreurs.Items.Add(token.ToString() + "\n"); tokenList.Add(token); } RemplirTableSymbole(tokenList, dictTableSymbole); }
public Lexer(FrmCompilateur pFrmCompilateur) { FrmCompilateur = pFrmCompilateur; }