ANSI C 语法中的八进制数字 (lex)

Octal digit in ANSI C grammar (lex)

我看了ANSI C grammar (lex)

这是八进制数字正则表达式

0{D}+{IS}?      { count(); return(CONSTANT); }

我的问题是为什么他们会接受类似 0898 的内容?

不是八进制数。

所以我以为他们会考虑那个,但他们就是这样写的。

你能解释一下这是为什么吗?谢谢

您在问题中反复 link 的语法产生于 1985,比 出版 4 年1989 年第一次 C 标准修订。

不是1989的标准中公布的语法,明明是用

octal-constant:

  • 0

  • octal-constant octal-digit

octal-digit: one of

  • 0 1 2 3 4 5 6 7

即便如此,Lex 语法也足以标记 有效 程序。

请记住,这只是语法,不是语义。
所以检测"Cannot be anything but a constant.".
就足够了 没有必要(还)检测 "A correct octal constant."。

请注意,它甚至没有区分八进制、十进制、十六进制。全部注册为"CONSTANT".

您想要合理、用户友好的错误消息。

如果您的词法分析器接受 0999,您可以检测到非法的八进制数字并输出合理的消息:

 int x = 0999;
          ^
 error: illegal octal digit, go back to school

如果没有,它会将其解析为两个单独的标记 0999 并将它们传递给解析器。产生的错误消息可能会非常混乱。

 int x = 0999;
          ^
 error: expected ‘,’ or ‘;’ before numeric constant

无论哪种方式,无效程序都应该被拒绝,但是表面上不正确的 lex 语法在错误报告方面做得更好。

这表明为 lexyacc 等工具构建的实用语法不必与语言定义中的理想语法完全对应。