缺少<locale>中的函数 - islower()和isupper()

时间:2016-07-10 13:24:07

标签: c echo locale yacc lex

我正在尝试使用lex和yacc进行编译,但由于某种原因,代码在我的MAC中的VM机器中不起作用,因为它表示标题中缺少某些功能。这些函数是islower()和isupper()。由于某些原因,ECHO和yylex也缺失了。我已经卸载并为lex和yacc安装了bison和flex,但没有修复它。

相同的代码在我的Windows计算机的VM计算机中正常工作。所以我的代码不是问题。 这是错误error caused with functions missing

1 个答案:

答案 0 :(得分:1)

  1. islowerisupper位于<ctype.h>,而不是<locale.h>。某些符合非标准的C库实现可能会提供locale.h,其中也包含ctype.h,但在Mac OS X上安装标准C的情况肯定不是这样(或者,对于那个问题,Linux)。

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

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

    int yylex(void);
    

    匹配lex / flex生成的yylex(再次,没有任何重入声明)。

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

      

    序言可以定义动作中使用的类型和变量。您还可以使用预处理器命令来定义在那里使用的宏,并使用#include包含执行上述任何操作的头文件。 您需要在此处声明词法分析器yylex和错误打印机yyerror以及语法规则中的操作使用的任何其他全局标识符。

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

    clang使用插入符号向您显示错误的精确位置的机制存在缺陷,但我认为您总是同意这一点向您展示原始的源代码行及其相应的行号是非常友好的。