Сообщение означает именно то, что оно говорит. Вы используете символ character
, но вы не объявили его токеном и не предоставили для него продукцию. Поэтому он не является ни терминальным, ни нетерминальным, и генератор синтаксического анализатора жалуется, когда он используется.
То, что происходит в вашем лексере, не видно генератору парсера. Поэтому тот факт, что вы (бессмысленно, ИМХО) создали определение лексера {character}
, представляет интерес только внутри файла лексера. (Это бессмысленно, потому что вы могли бы эквивалентно использовать класс символов Posix [[:alpha:]]
, который имеет ясное значение и столь же читабелен, как и {character}
.) И действительно, парсеру не нужно ничего знать о том, как лексер предлагает кодовое значение токена Поэтому, когда вы объявляете токен в определении парсера, генератор парсера помещает определение для этого символа в заголовочный файл; этот заголовочный файл получает лексер #include
, что позволяет ему использовать этот символ в качестве возвращаемого значения для синтаксического анализатора. Никакого другого общения не требуется.