Не являются ли [@ $ `] и другие подобные символы (возможно, из unicode) лексическими ошибками в C, если они помещены где-либо за пределами строки или комментария? Они не составляют никакой действительной лексической последовательности этого языка. Они не могут передать лексер, потому что лексер не может распознать их как какой-либо действительный токен. Обычно лексеры основаны на FSM или регулярных выражениях, поэтому эти символы являются просто нераспознанным вводом.
Например, в следующем коде есть несколько лексических ошибок:
int main(void){
` int a = 3;
@ —
return 0;
}
Мы можем поддержать это, передав это gcc, что дает
../a.c: In function ‘main’:
../a.c:2: error: stray ‘`’ in program
../a.c:3: error: stray ‘@’ in program
../a.c:3: error: stray ‘\342’ in program
../a.c:3: error: stray ‘\200’ in program
../a.c:3: error: stray ‘\224’ in program
GCC является умным и выполняет восстановление после ошибок, поэтому он проанализировал определение функции (он знает, что мы находимся в 'main'), но эти ошибки определенно выглядят как лексические ошибки, они не являются синтаксическими ошибками и это правильно. У лексера GCC нет никаких типов токенов, которые можно собрать из этих символов. Обратите внимание, что он даже обрабатывает трехбайтовый символ UTF-8 как три нераспознанных символа.