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

标签 c regex grammar lex

我看了ANSI C grammar (lex) .

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

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

我的问题是为什么他们接受像 0898 这样的东西?

这不是八进制数。

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

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

最佳答案

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

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

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

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

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

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

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

关于c - ANSI C 语法中的八进制数字 (lex),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55991194/

相关文章:

parsing - Flex 和 Bison - 有时关心空格的语法

Java 正则表达式 : Check in specific order

c - 我的 C 语法的左递归错误

c - 指向常量数组的双指针

c - 如何在 swift 3 中使用我的静态库 (.a)

c# - Visual Studio 格式文档——如何用 C# 编写

java - java中的正则表达式用于密码验证

eclipse - 是否可以通过Xtext/Xpand中的相同元素名称访问引用或终端?

c - 如何取消引用指向堆上指针的指针?

c - 这个指针符号是什么意思?