Есть ли способ получить доступ к встроенным в C ключевым словам, таким как int или char или return? - PullRequest
0 голосов
/ 07 февраля 2012

Есть ли функция или метод для доступа к ключевым словам C, как указано в вопросе?Единственный способ, которым я могу думать об этом, - это создание констант, которые будут просто проверяться, чтобы увидеть, есть ли совпадение, но это может быть много, чтобы напечатать, так как есть много ключевых слов.Я надеялся, что что-то было.(Новое в C)

Это домашнее задание, поэтому я не могу использовать регулярные выражения или синтаксический анализ библиотек.Цель HW - дать моей программе функцию и просто вернуть идентификаторы, поэтому я надеялся, что есть способ получить доступ к ключевым словам проще, чем набирать их все.

Пример:

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

И он должен вернуть foo, args, x, c.

Я не ищу ответа, так что хороший совет, если он есть, был бы великолепен!Если нет, то просто дайте мне знать, что утомительный путь - единственный вариант.

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Чтобы идентифицировать идентификаторы (в отличие от других типов токенов) в источнике, вам необходимо добавить лекс к источнику.

Один из самых простых способов сделать это - реализовать Алгоритм Томпсона и использовать грамматику предварительной обработки из спецификации языка C99. После того, как источник будет лексирован (или во время лексирования), вам просто нужно создать список идентификаторов предварительной обработки, которые не являются ключевыми словами C99. Это довольно просто реализовать в нескольких сотнях строк кода.

1 голос
/ 07 февраля 2012

Вам потребуется написать программу для чтения файла, построив слова из последовательности буквенно-цифровых символов. Вам понадобится список ключевых слов в C - это довольно короткий. Затем вы сравните прочитанные слова со списком ключевых слов и распечатаете первое вхождение каждого из них (поэтому вам также нужно будет сохранить слова, которые вы видели).

Вам необходимо знать, что вы должны делать с директивами препроцессора; Вы можете игнорировать их. Вам нужно знать, как распознавать числа, строки символов и символьные константы. Вам нужно знать, как распознавать комментарии /* ... */ и // ... to EOL (или, возможно, не в первой версии).

В конце концов, вы можете быть втянуты в различные виды деятельности, такие как строки, растягивающиеся на разрывы строк, и комментарии, такие как:

/\
\
* This is a C comment
*\
\
/

Однако вы почти наверняка можете пропустить эти тонкости при первом проходе.

0 голосов
/ 07 февраля 2012

Нет встроенного способа доступа к языку изнутри.Добро пожаловать в C, страну самоделки.Да, вам придется токенизировать входной поток и проверить каждое слово.Для токенизации, проверьте функцию strcspn () (строка комплимента "\ t \ n" (пробел, табуляция, перевод строки), вероятно, достаточно хороша, чтобы вы пошли туда.

Затем создайте NULL-завершенныймассив строк, например

const char *identifiers [] = {
    "int",
    "continue",
     NULL
};

и итерации по нему, выполняя strcmp () на входе против членов массива. Если вы нажмете завершающий NULL, вы знаете, что он не находится в массиве (бонусные баллыза использование отсортированного массива и утилиты libc's bsearch (3)!).

...