是否有一个函数或方法来访问问题中提到的C关键字?我能想到的唯一方法是创建常量,只需要检查是否有任何匹配,但这可能需要输入很多,因为有很多关键字。我希望有什么东西。 (C新手)
这是一个家庭作业,所以我不能使用正则表达式或解析库。硬件的目的是为我的程序提供一个函数并返回标识符,因此,为什么我希望有一种方法来访问关键字比输入所有关键字更容易。
示例:
int foo (int args)
{
int x = 7;
char c = 'a';
args = x + c;
return args;
}
它应该返回foo,args,x,c。
我不是在寻找答案,所以如果有一个好的暗示会很好!如果没有,那就让我知道这种繁琐的方式是唯一的选择。
答案 0 :(得分:2)
要识别源中的标识符(与其他标记种类不同),您需要了解源代码。
最简单的方法之一是实现Thompson's Algorithm并使用the C99 language specification.中的预处理语法。一旦源被lexed(或在lexing期间),您只需要创建预处理列表不是C99关键字的标识符。在几百行代码中实现它非常简单。
答案 1 :(得分:1)
您需要编写一个程序来读取文件,从字母数字字符序列构建“单词”。您需要一个C中的关键字列表 - 这很短。然后你会将你读到的单词与关键字列表进行比较,并打印出每个单词的第一个出现(所以你还需要存储你看过的单词)。
您需要知道您对预处理程序指令的期望;你可以忽略它们。您需要知道如何识别数字,字符串和字符常量。您需要知道如何识别/* ... */
和// ... to EOL
条评论(或者可能不在第一个版本中)。
最终,您可能会陷入诸如字符串之类的行业,这些字符串会延长换行符和评论,例如:
/\
\
* This is a C comment
*\
\
/
但是,你几乎可以在第一次通过时省略这些细微之处。
答案 2 :(得分:0)
没有从内部访问语言的内置方式。欢迎来到C,自己动手的土地。是的,您将不得不对输入流进行标记化并测试每个单词。对于标记化,检查strcspn()函数(“\ t \ n”(空格,制表符,换行符)的补充字符串可能足以让你去那里。
然后构建一个以NULL结尾的字符串数组,例如
const char *identifiers [] = {
"int",
"continue",
NULL
};
并迭代它,对输入和数组成员执行strcmp()。如果你点击终止NULL,你知道它不在数组中(使用排序数组和libc的bsearch(3)实用程序的奖励积分!)。