Первое замечание: когда вы получаете символ и хотите сравнить его с EOF, вы должны сохранить символ в int , а не в символе, поэтому
void getChar()
{
if((nextChar=getc(fp))!=EOF)
{
if(isalpha(nextChar))
charClass=LETTER;
else if(isdigit(nextChar))
charClass=DIGIT;
else
charClass=UNKNOWN;
}
else
charClass=EOF;
}
не очень хорошо управляет делом EOF , потому что nextChar является char , может быть:
void getChar()
{
if((charClass=getc(fp))!=EOF)
{
nextChar = charClass;
if(isalpha(nextChar))
charClass=LETTER;
else if(isdigit(nextChar))
charClass=DIGIT;
else
charClass=UNKNOWN;
}
}
Второе замечание: вы забылиуправляйте делом '=', поэтому я думаю, что в lookup(char ch)
вы должны добавить регистр:
case '=':addChar();
nextToken=ASSIGN_OP;
break;
, поэтому вы останавливаетесь после прочтения '='.
Если явыполните следующие изменения:
pi@raspberrypi:/tmp $ gcc -g -Wextra q.c
pi@raspberrypi:/tmp $ cat in
a = (b + 2) * c
pi@raspberrypi:/tmp $ ./a.out in
Next token is :11, next lexeme is a
Next token is :20, next lexeme is =
Next token is :25, next lexeme is (
Next token is :11, next lexeme is b
Next token is :21, next lexeme is +
Next token is :10, next lexeme is 2
Next token is :26, next lexeme is )
Next token is :23, next lexeme is *
Next token is :11, next lexeme is c
^C
Я должен завершить выполнение, потому что программа зацикливается, это потому, что в getNonBlank()
случае EOF не управляют, поэтому:
void getNonBlank()
{
while((charClass != EOF) && isspace(nextChar))
getChar();
}
После этого изменения:
pi@raspberrypi:/tmp $ ./a.out in
Next token is :11, next lexeme is a
Next token is :20, next lexeme is =
Next token is :25, next lexeme is (
Next token is :11, next lexeme is b
Next token is :21, next lexeme is +
Next token is :10, next lexeme is 2
Next token is :26, next lexeme is )
Next token is :23, next lexeme is *
Next token is :11, next lexeme is c
Next token is :-1, next lexeme is EOF
Как говорит chqrlie в замечании, также замените if(fopen == NULL)
на if (fp == NULL)