Не видя полной грамматики, я думаю, что ваша проблема заключается в отсутствии токена EOF в вашем основном правиле. ANTLR4 потребляет столько данных, сколько может, но если он не соответствует чему-либо хотя бы в основном правиле, он игнорирует остальное, что объясняет, почему вы не видите ошибку. Добавляя EOF, вы сообщаете вашему ANTLR4, что все входные данные должны совпадать:
calc: choice INTEGER INTEGER EOF;
предупреждение C4245: «инициализация»: преобразование из int в unsigned int ', несоответствие со знаком / без знака
На уровне предупреждения 4.
Дает мне предупреждение:
предупреждение: преобразование отрицательного значения
-0x00000000a 'до
unsigned int'
Без каких-либо директив -W.
Вы должны использовать:
gcc main.c -Wconverver
, который выдаст предупреждение :
предупреждение: отрицательное целое число неявно преобразуется в тип без знака
Обратите внимание, что -Wall не включит это предупреждение.
Возможно, вам просто нужно увеличить уровни предупреждений.
For gcc compiler you can add
gcc -Wconversion ...
And this will produce the following warning
warning: converting negative value '-0x0000000000000000a' to 'unsigned int'
Преобразование со знаком int
в без знака int
является чем-то известным в стандарт C как «обычное арифметическое преобразование», так что это не ошибка.
Причина, по которой компиляторы часто не выдают предупреждение об этом по умолчанию, заключается в том, что это так часто делается в коде, что было бы слишком много «ложных» Позитивные предупреждения вынесены в целом. Существует огромное количество кода, который работает со значениями со знаком int
и работает с вещами, которые по своей природе не имеют знака (например, для расчета размеров буфера). Также очень часто смешивать значения со знаком и без знака в выражениях.
Это не значит, что эти тихие преобразования не несут ответственности за ошибки. Таким образом, может быть неплохо включить предупреждение для нового кода, чтобы s "чистый" с самого начала. Тем не менее, я думаю, что вы, вероятно, сочтете довольно трудным иметь дело с предупреждениями, выданными существующим кодом.
-10 анализируется как целочисленное значение, и присваивание int для unsigned int разрешено. Чтобы узнать, что вы делаете что-то не так, компилятор должен проверить, является ли ваше целое число (-10) отрицательным или положительным. Поскольку это больше, чем проверка типов, я думаю, что она была отключена из-за проблем с производительностью.