Что может создать лексическую ошибку в C?
кроме того, не закрытия комментария /*...
, Что представляет собой лексическую ошибку в C?
6 ответов
вот некоторые:
"abc<EOF>
где EOF-это конец файла. Фактически, EOF в середине многих лексем должен производить ошибки:
0x<EOF>
Я предполагаю, что использование плохих побегов в строках незаконно:
"ab\qcd"
вероятно, проблема с экспонентами с плавающей запятой
1e+%
возможно, у вас не должно быть материала в конце директивы препроцессора:
#if x %
в основном все, что не соответствует ISO C 9899/1999, приложение A. 1 "лексическая грамматика" является лексической ошибкой, если компилятор делает свой лексический анализ в соответствии с этой грамматикой. Вот несколько примеров:
"abc<EOF> // invalid string literal (from Ira Baxter's answer) (ISO C 9899/1999 6.4.4.5)
'a<EOF> // invalid char literal (6.4.4.4)
где EOF-конец файла.
double a = 1e*3; // misguided floating point literal (6.4.4.2)
int a = 0x0g; // invalid integer hex literal (6.4.4.1)
int a = 09; // invalid octal literal (6.4.4.1)
char a = 'aa'; // too long char literal (from Joel's answer, 6.4.4.4)
double a = 0x1p1q; // invalid hexadecimal floating point constant (6.4.4.2)
// instead of q, only a float suffix, that is 'f', 'l', 'F' or 'L' is allowed.
// invalid header name (6.4.7)
#include <<a.h>
#include ""a.h"
не являются ли [ @ $ ` ] и другие подобные символы (возможно, из unicode) лексическими ошибками в C, если они помещены вне строки или комментария? Они не составляют какой-либо действительной лексической последовательности этого языка. Они не могут передать лексер, потому что лексер не может распознать их как какой-либо действительный токен. Обычно лексеры основаны на FSMs или regex, поэтому эти символы являются просто непризнанными входными данными.
например, в следующем коде есть несколько лексических ошибки:
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 ‘2’ in program
../a.c:3: error: stray ‘0’ in program
../a.c:3: error: stray ‘4’ in program
GCC умный и делает восстановление ошибок, поэтому он проанализировал определение функции (он знает, что мы находимся в "main"), но эти ошибки определенно выглядят как лексические ошибки, они не являются синтаксическими ошибками и правильно. Лексер GCC не имеет никаких типов токенов, которые могут быть построены из этих символов. Обратите внимание, что он даже рассматривает трехбайтовый символ UTF-8 как три нераспознанных символа.
незаконный id
int 3d = 1;
Незаконная директива препроцессора
#define x 1
неожиданный маркер
if [0] {}
неразрешимый id
while (0) {}
лексические ошибки:
- unterminated комментарий
- любая последовательность символов без комментариев и пробелов, которая не является допустимым токеном препроцессора
- любой токен препроцессора, который не является допустимым токеном C; примером является
0xe-2
, который выглядит как выражение, но на самом деле является синтаксической ошибкой в соответствии со стандартом-нечетный угловой случай, возникающий из правил для pp-токенов.