Конец файлового дескриптора в грамматической реализации
-
20-08-2019 - |
Вопрос
Я работаю над реализацией компилятора и хочу проверить, достигнут ли конец файла?
Я знаю, что это можно сделать с помощью функции yywrap() в файле lex, но требование заключается в том, что мы хотим, чтобы EOF был явно определен как в шестнадцатеричном значении 0x1a, тогда как мы можем ссылаться на это.
Пример:
main() { printf("Проверить маркер EOF ");"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.
}
Решение
Сделайте так, чтобы ваш lexer возвращал токен для EOF.
Я предлагаю вам вернуть жетон в двух случаях:
getc()
возвращенный-1
(обычный знак EOF).В этом случае сделайте текст токена пустымgetc()
возвращенный'\x1a'
.В этом случае поместите этот символ в текст токена.
Это позволяет вашей грамматике различать эти два случая.