Таким образом, кажется, что ANTLR3C использует указатели функций, чтобы позволить пользователям переопределять их, если мы хотим написать свои собственные функции.Мне нужно переопределить функцию сообщения об ошибках:
Указатель
void(*displayRecognitionError)(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
pANTLR3_UINT8 * tokenNames);
Функция
static void displayRecognitionError (pANTLR3_BASE_RECOGNIZER recognizer,
pANTLR3_UINT8 * tokenNames);
Сейчас у меня есть следующее:
@lexer::apifuncs {
RECOGNIZER->displayRecognitionError = displayRecognitionErrorNew;
}
@lexer::includes {
#include "lexerData.h"
static void displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer,
pANTLR3_UINT8 * tokenNames);
}
@lexer::members {
#include "lexerError.h"
}
с новым кодом ошибки (который все работает) в файле lexerError.h.Я пытаюсь изменить это, перемещая функцию error внутри класса lexerData, но, к сожалению, я получаю ошибку компиляции, когда пытаюсь установить указатель функции на член класса.
compileUnit.cpp:179:62: error: argument of type ‘void (lexerData::)(ANTLR3_BASE_RECOGNIZER_struct*, uint8_t**)’ does not match ‘void (*)(ANTLR3_BASE_RECOGNIZER_struct*, uint8_t**)’
Из того, что я прочитал, это не простая проблема приведения или синтаксиса.Что я должен сделать, чтобы это позволить?Похоже, одним из исправлений было изменение определения указателя на функцию, но мне нужно иметь возможность назначить указатель на функцию для разных классов, так как лексер запускается дважды с разными структурами данных.