gpt4 book ai didi

c - 中的函数缺失 - islower() 和 isupper()

转载 作者:行者123 更新时间:2023-11-30 15:07:21 27 4
gpt4 key购买 nike

我正在尝试使用 lex 和 yacc 进行编译器,但由于某种原因,该代码无法在我的 MAC 中的 VM 机器中运行,因为它说 header 中缺少一些函数。这些函数是 islower() 和 isupper()。 ECHO 和 yylex 由于某种原因也丢失了。我已经为 lex 和 yacc 卸载并安装了 bison 和 flex,但没有修复它。

相同的代码在我的 Windows 计算机中的 VM 机器上运行良好。所以我的代码不是问题。这是错误error caused with functions missing

最佳答案

  1. islowerisupper位于 <ctype.h> ,不在 <locale.h> 中。某些不符合标准的 C 库实现可能会提供 locale.h其中还包括ctype.h ,但 Mac OS X(或者 Linux)上的标准 C 安装肯定不是这种情况。

  2. 您有责任写 yyerror ;您还必须在调用它的任何文件中提供准确的原型(prototype)。它将被 yacc/bison 生成的解析器自动调用,但 yacc/bison 并没有对 yyerror 提出任何特殊要求。原型(prototype)。它可以返回任何类型,也可以不返回任何类型,因为 yacc/bison 生成的解析器从不使用返回值。如果您想编写一个执行某种 printf 样式插值的版本,它可以是一个可变参数函数。您还需要在使用它的任何其他翻译 union 中声明它(正如您的词法分析器显然所做的那样)。

  3. yylex也不会由 yacc/bison 生成的语法自动声明,尽管它被调用并预计返回 int 。使用野牛生成的解析器,可以将精确的参数提供给 yylex (和 yyerror )取决于各种野牛声明;特别是,如果您指定词法分析器是可重入的,则 bison 将提供其他参数。在最简单的情况下(没有野牛声明),原型(prototype)应该是

    int yylex(void);

    yylex 匹配由 lex/flex 生成(同样,没有任何重入声明)。

    在传统 C 中,上面的声明不是必需的,因为 int是未声明函数的默认返回类型,调用中缺少参数与定义中缺少参数相匹配。然而,现代 C 编译器(例如 OS X 上的 clang 和/或 gcc)会警告您缺少原型(prototype),即使代码无论如何都能工作。强烈建议您包含显式声明,如 bison manual 中所述。 :(第 1.9 节,添加强调)

    The prologue may define types and variables used in the actions. You can also use preprocessor commands to define macros used there, and use #include to include header files that do any of these things. You need to declare the lexical analyzer yylex and the error printer yyerror here, along with any other global identifiers used by the actions in the grammar rules.

  4. 我不知道你从哪里得到编译器提示 ECHO 的印象。 ,除非它是放错位置的插入符号;错误文本清楚地表明问题出在 yyerror 。插入符号位于错误的位置,因为显示的行是词法定义文件中的源行,而 C 编译器实际上提示的行是由 flex 生成的行,它不包含模式 .因此间距略有不同。

    这是 clang 机制的一个弱点,它使用插入符号向您显示错误的精确位置,但我认为您会同意,总的来说,向您显示错误的位置要友好得多原始源代码行及其相应的行号。

关于c - <locale> 中的函数缺失 - islower() 和 isupper(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38292350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com