有没有办法访问C的内置关键字,如'int'或'char'或'return'?

时间:2012-02-07 05:51:16

标签: c programming-languages

是否有一个函数或方法来访问问题中提到的C关键字?我能想到的唯一方法是创建常量,只需要检查是否有任何匹配,但这可能需要输入很多,因为有很多关键字。我希望有什么东西。 (C新手)

这是一个家庭作业,所以我不能使用正则表达式或解析库。硬件的目的是为我的程序提供一个函数并返回标识符,因此,为什么我希望有一种方法来访问关键字比输入所有关键字更容易。

示例:

int foo (int args) 
{ 
    int x = 7; 
    char c = 'a'; 
    args = x + c; 
    return args; 
}

它应该返回foo,args,x,c。

我不是在寻找答案,所以如果有一个好的暗示会很好!如果没有,那就让我知道这种繁琐的方式是唯一的选择。

3 个答案:

答案 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)实用程序的奖励积分!)。