- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 lex 和 yacc 进行编译器,但由于某种原因,该代码无法在我的 MAC 中的 VM 机器中运行,因为它说 header 中缺少一些函数。这些函数是 islower() 和 isupper()。 ECHO 和 yylex 由于某种原因也丢失了。我已经为 lex 和 yacc 卸载并安装了 bison 和 flex,但没有修复它。
最佳答案
islower
和isupper
位于 <ctype.h>
,不在 <locale.h>
中。某些不符合标准的 C 库实现可能会提供 locale.h
其中还包括ctype.h
,但 Mac OS X(或者 Linux)上的标准 C 安装肯定不是这种情况。
您有责任写 yyerror
;您还必须在调用它的任何文件中提供准确的原型(prototype)。它将被 yacc/bison 生成的解析器自动调用,但 yacc/bison 并没有对 yyerror
提出任何特殊要求。原型(prototype)。它可以返回任何类型,也可以不返回任何类型,因为 yacc/bison 生成的解析器从不使用返回值。如果您想编写一个执行某种 printf 样式插值的版本,它可以是一个可变参数函数。您还需要在使用它的任何其他翻译 union 中声明它(正如您的词法分析器显然所做的那样)。
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 analyzeryylex
and the error printeryyerror
here, along with any other global identifiers used by the actions in the grammar rules.
我不知道你从哪里得到编译器提示 ECHO
的印象。 ,除非它是放错位置的插入符号;错误文本清楚地表明问题出在 yyerror
。插入符号位于错误的位置,因为显示的行是词法定义文件中的源行,而 C 编译器实际上提示的行是由 flex 生成的行,它不包含模式 .
因此间距略有不同。
这是 clang 机制的一个弱点,它使用插入符号向您显示错误的精确位置,但我认为您会同意,总的来说,向您显示错误的位置要友好得多原始源代码行及其相应的行号。
关于c - <locale> 中的函数缺失 - islower() 和 isupper(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38292350/
我正在尝试用 C++ 开发 BattleShip 游戏,我快完成了。为此,我需要我的 gameOver 函数正常工作。当所有的船都沉没时,我的游戏就结束了。因此,我试图计算我的字符串状态(来自 Shi
我正在做一些 Python 自学(非常初学者),我对这个练习感到困惑 - 旨在检查字符串是否有任何小写字母: def is_lower(word): for x in word:
我在下面的程序中尝试了数组,指针和字符串,但我不知道我哪里出错了。 #include #include #include // finding out the uper case and low
所以我编写了一个基本程序来检查字符串中的小写元音并显示找到的数量。 一开始我用的是这个: for (char ch : str) { if (islower(ch) == tr
我最近偶然发现了 curses.ascii.islower() .它检查传递的字符是否为小写。与 str.islower() 相比,使用此函数有什么好处? ?是的,它需要将 ASCII 字符转换为字符
我的设置:glibc 2.24、gcc 6.2.0、UTF-8 环境。 当我们在下面的test.c中调用islower()时,结果被正确打印: #include #include #include
我正在尝试使用 lex 和 yacc 进行编译器,但由于某种原因,该代码无法在我的 MAC 中的 VM 机器中运行,因为它说 header 中缺少一些函数。这些函数是 islower() 和 isup
我有一个 std::wstring,我想找出哪个字符在上面大小写,哪些是小写。 std::isupper 和 islower 似乎只处理 ASCII 字符,但我希望能够找出所有字符各种大小写字符 例如
>>> from ctypes import * >>> import ctypes.util >>> libc = CDLL("libc.so.6") >>> libc.printf("%c\n",
这似乎违背了每一个设计准则。 接受 T 类型的单个参数的静态方法通常应该只是成员方法。 太奇怪了,我实际上不得不发布 StackOverflow question了解 IsUpper 的存在(因为它没
我创建了一个简单的程序来检查用户输入的字母是大写还是小写,然后使用std::isupper()和std::islower()函数将小写字母转换为大写字母,并将大写字母转换为小写字母。在运行代码时,我得
为什么 islower() 和 friend 需要处理 EOF,而 putchar() 和 friend 不需要? 为什么 islower() 不将 int 视为 unsigned char,就像 p
我在如何使用 isUpper、isLower 和 isDigit 时遇到了问题。具体来说,我试图获取一个字符串并为字符串中的每个字符返回一个元组列表,其中包含三个 Bool 值,用于表示字符是大写字母
我有一个类似这样的代码片段: char choice; do { cout > choice; if(islower(choice) == 0){ toupper(choice); }
我尝试了以下但没有得到 0 或 1。问题是如何让这个程序打印出 0 或 1 的 bool 值而不使用 C++ 中的条件语句。 char input; char output; cout > input
关于 islower() 和 isupper() 的下面两行在 Mike Banahan 的 C 书的同一段落中给出了 (Link: Section 9.3) : islower(int c) Tru
我是一名优秀的程序员,十分优秀!