ANSI C 语法中的八进制数字 (lex)
Octal digit in 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
如果没有,它会将其解析为两个单独的标记 0
和 999
并将它们传递给解析器。产生的错误消息可能会非常混乱。
int x = 0999;
^
error: expected ‘,’ or ‘;’ before numeric constant
无论哪种方式,无效程序都应该被拒绝,但是表面上不正确的 lex 语法在错误报告方面做得更好。
这表明为 lex
或 yacc
等工具构建的实用语法不必与语言定义中的理想语法完全对应。
这是八进制数字正则表达式
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
如果没有,它会将其解析为两个单独的标记 0
和 999
并将它们传递给解析器。产生的错误消息可能会非常混乱。
int x = 0999; ^ error: expected ‘,’ or ‘;’ before numeric constant
无论哪种方式,无效程序都应该被拒绝,但是表面上不正确的 lex 语法在错误报告方面做得更好。
这表明为 lex
或 yacc
等工具构建的实用语法不必与语言定义中的理想语法完全对应。