私の字句解析器は、数字 (5,555,543667)、小数 (44.65,4.1)、およびピリオド (.) を認識します。
数字、小数、ピリオドは問題なく数えることができますが、数字とピリオドが隣り合っていると、小数としてカウントされます。
555 2.3 55.23 44 5 を含むテキスト ファイルを考えてみましょう。
私の出力は
1型1:555
2型3:2.3
3型3:55.23
4型1:44
5型3:5。
タイプ 3 は、10 進数の識別子です。
5 番目と 6 番目のトークンを数字として、次にピリオドとしてカウントしたいと思います。
これが私のswitchステートメントの処理方法です。
switch(*b) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
digits:
t.length++;
switch(*(b + t.length)) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
goto digits;
case '.':
goto decimal;
break;
default:
break;
}
t.type = TOKEN_DIGITS;
t.string = (char *)calloc(t.length + 1, sizeof(char));
strncpy(t.string, b, t.length);
break;
decimal:
t.length++;
switch(*(b + t.length)) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
goto decimal;
break;
}
t.type = TOKEN_DECIMAL;
t.string = (char *)calloc(t.length+1,sizeof(char));
strncpy(t.string,b,t.length);
break;
複数のことを試しましたが、公式には立ち往生しています。