我看了ANSI C grammar (lex) .
这是八进制数字正则表达式
0{D}+{IS}? { count(); return(CONSTANT); }
我的问题是为什么他们接受像 0898
这样的东西?
这不是八进制数。
所以我认为他们会考虑,但他们只是那样写。
你能解释一下这是为什么吗?谢谢
最佳答案
您需要合理、用户友好的错误消息。
如果您的词法分析器接受 0999
,您可以检测到非法的八进制数字并输出一条合理的消息:
int x = 0999; ^ error: illegal octal digit, go back to school
如果没有,它会将其解析为两个单独的标记 0
和 999
并将它们传递给解析器。产生的错误消息可能会非常困惑。
int x = 0999; ^ error: expected ‘,’ or ‘;’ before numeric constant
无论哪种方式,无效的程序都应该被拒绝,但是表面上不正确的 lex 语法在错误报告方面做得更好。
这表明为 lex
或 yacc
等工具构建的实用语法不必与语言定义中的理想语法完全对应。
关于c - ANSI C 语法中的八进制数字 (lex),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55991194/