Я работаю над реализацией компилятора и хочу проверить, достигнут ли конец файла?
Я знаю, что это можно сделать с помощью функции yywrap () в файле lex, но требуется, чтобы мы хотели, чтобы EOF был явно определен, как в шестнадцатеричном значении 0x1a, тогда как мы можем ссылаться на это.
Пример:
основной() { printf ("Проверить маркер EOF \ n"); '0x1a' <- фактический маркер EOF.
Я хочу, чтобы приведенное выше не было синтаксической ошибкой, а сообщалось как ошибка Несбалансированные круглые скобки или неправильно определены.
Можно ли это сделать? Мое требование - просто иметь токен EOF в синтаксическом анализаторе, что, к сожалению, я не смог сделать до настоящего времени: - ((, остальная работа будет легко выполнена, я просто должен дать правило такой как:
print : print_stmt '(' stmt_valid ')' colon '\n'
{
OK do the rest
}
| print_stmt '(' stmt_valid ')' colon end_indicator
{
print error message and close application.
}





Сделайте так, чтобы ваш лексер возвращал токен для EOF.
Предлагаю вам вернуть токен в двух случаях:
getc() вернул -1 (обычный знак EOF). В этом случае сделайте текст токена пустым
getc() вернул '\x1a'. В этом случае поместите этот символ в текст токена.
Это позволяет вашей грамматике различать эти два случая.
Какая у вас конфигурация? Насколько я понимаю, вы используете lex для сканирования и yacc для анализа. Почему бы lex не прочитать символ EOF и не вернуть yacc специальный токен EOF?