Конец файлового дескриптора в грамматической реализации

StackOverflow https://stackoverflow.com/questions/348788

Вопрос

Я работаю над реализацией компилятора и хочу проверить, достигнут ли конец файла?

Я знаю, что это можно сделать с помощью функции 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.

Я предлагаю вам вернуть жетон в двух случаях:

  1. getc() возвращенный -1 (обычный знак EOF).В этом случае сделайте текст токена пустым

  2. getc() возвращенный '\x1a'.В этом случае поместите этот символ в текст токена.

Это позволяет вашей грамматике различать эти два случая.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top