示例#1
0
        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)));
        }
示例#2
0
        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);
        }
示例#3
0
 public Lexer(FrmCompilateur pFrmCompilateur)
 {
     FrmCompilateur = pFrmCompilateur;
 }