什么可以在C中创建词法错误?

时间:2011-04-04 06:39:37

标签: c compiler-errors lexical-analysis

除了不关闭评论/*...之外,C中的词汇错误是什么构成?

6 个答案:

答案 0 :(得分:8)

以下是一些:

 "abc<EOF>

其中EOF是文件的结尾。事实上,在许多词位中间的EOF应该产生错误:

 0x<EOF>

我认为在字符串中使用错误的转义是非法的:

  "ab\qcd"

浮点指数可能有问题

 1e+%

可以说,你不应该在预处理器指令的末尾有东西:

#if x   %

答案 1 :(得分:2)

基本上任何不符合ISO C 9899/1999附录A.1“Lexical Grammar”的词汇都是词汇错误,如果编译器根据这个语法进行词法分析。以下是一些例子:

"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"

答案 2 :(得分:2)

如果放在字符串或注释之外的任何地方,是不是[@ $`]和其他符号(可能来自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符号视为三个无法识别的符号。

答案 3 :(得分:0)

形成错误的浮点常数(例如123.34e123.45.33)。

答案 4 :(得分:0)

非法身份证

int 3d = 1;

非法预处理程序指令

#define x 1

意外的令牌

if [0] {}

无法解析的身份

while (0) {}            

答案 5 :(得分:0)

词汇错误:

  1. 未经审核的评论
  2. 任何非注释和非空白字符序列,它们不是有效的预处理器令牌
  3. 任何不是有效C令牌的预处理程序令牌;一个例子是0xe-2,它看起来像一个表达式但实际上是根据标准的语法错误 - 由pp-tokens规则产生的奇怪的角落情况。