어휘 분석기는 숫자 (5,555,543667), 소수 (44.65,4.1) 및 마침표 (.)를 인식합니다.어휘 분석기. 스위치를 사용하여 10 진수가 아닌 10 진수를 분석하고 계산합니다.
숫자, 소수 자릿수 및 마침표를 잘 계산할 수 있지만 숫자와 마침표가 서로 인접 해 있으면 십진수로 계산됩니다. 555 2.3 55.23 44 5.
내 출력이 될 것
1 유형 1 : 555
2 유형 3 : 2.3
3 유형 3 : 55.23
5 유형 3 : 5
여기서 유형 3은 10 진수의 식별자입니다.
다섯 번째 및 여섯 번째 토큰을 숫자로 계산 한 다음 마침표를 넣으려고합니다.
다음은 내 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;
여러 가지 시도가 있지만 공식적으로 막혔습니다.
어휘 분석은 많은 수고를 요구하는 곳이 아닙니다. 루프와 isdigit() 호출에 대해 생각해보십시오. –
gotos는 악마이고, 그들에게 익숙해지지 않으려 고 노력하십시오. 질문에 관해서는 문제는 전체 항목을 처리 할 때까지 사용자가 알지 못하는 것입니다. 먼저 문자열을 "단어"로 분리해야하며, 후자는 문자를 문자로 처리하는 대신 전체적으로 각 단어를 차례대로 처리해야합니다. – SJuan76
플렉스를 사용하는 것이 더 쉽지 않을까요? 이것이 학습 운동이라면 무엇을 배웠습니까? – rici