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

时间:2019-05-05 10:51:22

标签: c regex grammar lex

我看了ANSI C grammar (lex)

这是八进制正则表达式

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

我的问题是为什么他们会接受0898之类的东西?

这不是八进制数字。

所以我认为他们会考虑的,但是他们只是这样写。

您能解释为什么吗?谢谢

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

无效的程序会以任何一种方式被拒绝,但是表面上不正确的词法语法在错误报告方面做得更好。

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

答案 1 :(得分:4)

您在问题中反复链接的语法是在 1985 ,即于1989年发布第一个C标准修订版的4年之前。

这不是不是1989标准发布的语法,该标准显然使用了

  

八进制常数

     
      
  • 0

  •   
  • 八进制常数八进制数字

  •   
     

八位数字: 其中一个

     
      
  • 0 1 2 3 4 5 6 7
  •   

即使那样,Lex语法也足以标记化 valid 程序。

答案 2 :(得分:3)

请记住,这只是语法,而不是语义。
因此检测到“除了常量,不能是其他任何东西”就足够了。
尚未(尚未)检测到“正确的八进制常数”。

请注意,八进制,十进制,十六进制之间甚至没有区别。他们都注册为“常量”。