Конец файлового дескриптора в грамматической реализации - PullRequest
0 голосов
/ 08 декабря 2008

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

Я знаю, что это можно сделать с помощью функции yywrap () в файле lex, но необходимо, чтобы мы хотели, чтобы EOF явно определялся как шестнадцатеричное значение 0x1a, тогда как мы на него ссылаемся *

Пример:

Основной () { printf («Проверить маркер EOF \ n»); '0x1a' <- фактический маркер EOF. </p>

Я хочу, чтобы вышеприведенное не было синтаксической ошибкой, а сообщалось как ошибка Несбалансированные скобки, или неправильно определены.

Можно ли это сделать? Мое требование - просто иметь токен 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.
}

1 Ответ

3 голосов
/ 08 декабря 2008

Заставьте вашего лексера вернуть токен для EOF.

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

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

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

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

...