bonjour tous le monde
je suis entrain de réaliser un interpréteur d'expressions en c#.
et je suis dans la phase de réaliser un analyseur lexical qui présente une éthode GetNextLexem() qui renvoit le lexeme prochain.
voici le code de la méthode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
public Token GetNextLexeme()
{
int state=A;
StringBuilder lexem = new StringBuilder();
char c;
try
{
while ((lexem.Length!=0)||(_peek.hasNext()))
{
switch (state)
{
case A:
{
if (char.IsWhiteSpace(_peek.peek()))
{
c=_peek.get();
continue;
}
c=_peek.get();
lexem.Append(c);
switch(c)
{
case '<': state=B;
break;
case '>': state=C;
break;
case '!':
if(_peek.peek() == '=')
{
_peek.get();
return SCDIF;
}
else
{
lexem.Append('!');
state = T;
}
break;
case '=': state=E;
break;
// caractères spéciaux
case '.':
case '(':
case ')':
case '{':
case '}':
case ';':
case '+':
case '-':
case '*':
case '/':
case '%':
state = H; break;
// identifier, constante ou autre
default:
if (char.IsDigit(c)) state = F;
else if (char.IsLetter(c)) state = G;
else state = T;
break;
}
}
break;
case B:
{
if(_peek.peek() != '=')
return SCPPQ;
else
{
_peek.get();
return SCPPE;
}
}
case C:
{
if(_peek.peek() != '=') return SCPGQ;
else
{
_peek.get();
return SCPGE;
}
}
case E:
{
if(_peek.peek() != '=')
return SCEQUAL;
else
{
_peek.get();
return SCEGA;
}
}
case F:
if(char.IsDigit(_peek.peek()))
lexem.Append(_peek.get());
else
return new Constant(lexem.ToString());
break;
case G:
if(char.IsLetterOrDigit(_peek.peek()))
lexem.Append(_peek.get());
else
{
String s =lexem.ToString();
Token sym= (Token) _reservedword[s] ;
return(sym != null) ? sym : new Identifier(s);
}
break;
case H:
String chaine = lexem.ToString();
return ((Token) _specialchart[chaine]);
case T:
{
return null;
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString(), "ok", 1, "", "");
return null;
}
} |
voici aussi quelques définitions pour mieux comprendre la méthode:
state A=0,B=1,C=2,E=3,F=4,G=5,T=6 se sont des constantes
_specialchart et _reservedword se sont deux hashtable qui contiennent successivement les caractéres spéciales(;,.,<,etc.) et les mots resevés(if,else etc.)
_peek.hasNext() est une méthode qui vérifie que l'expression sur lequel le traitement est effectué contient encore des caractéres.
Token est une classe abstraite dont constante ,identifier etc héritent de cette méthode .elle représente un lexeme .
maintenant mon probléme c'est que j'ai une erreur dans le code.
voici l'erreur:
not all code paths return a value
est ce que personne peut m'aider ?parceque je me bloque là
Merci d'avance
Partager