我的词法分析器可识别数字(5,555,543667),小数(44.65,4.1)和句点(。)。C词法分析器。使用开关来分析和计算小数/非小数
我可以对数字,小数点和句点进行计数,但是当我遇到一个数字和句点相邻时,它会将其计为小数。
考虑包含一个文本文件: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是我的十进制标识符。
我想第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;
尝试了多件事,但我被正式卡住了。
词汇分析不是要求大量gotos的地方。考虑一些for循环和isdigit()调用。 –
gotos是邪恶的,尽量不要习惯于他们。至于这个问题,你的问题是,除非你处理完整个项目,否则你不知道这个案例。你需要首先将你的字符串分解成“单词”,后者逐个处理它们,每个单词作为一个整体(而不是逐个字符地处理)。 – SJuan76
使用flex会不会更容易?如果这是一个学习练习,你学到了什么? – rici