Форум: "Потрепаться";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
ВнизНебольшой вопрос по спецификации ANSI C++ Найти похожие ветки
← →
Digitman (2003-08-28 15:21) [0]Повод для трепа :
1. Плохо, когда забыл да еще и не знал)
2. Совсем плохо, когда "букваря" не нашлось под рукой в нужный момент)
Теперь - собссно проблемка..
Пусть грамматическое правило объявления типа в C/C++ имеет вид :
typedef ИМЯ идентификатор_синоним
Осветите, пожалуйста, следующий важный момент :
Обязан ли (в соответствии с ANSI C/C++) идентификатор_синоним содержать (кроме прочих допустимых спецсимволов а-ля _ , * ) символы исключительно верхнего регистра ?
Или практика написания синонима в верхнем симв.регистре - лишь умалчиваемое "правило хорошего тона" ?
← →
jel (2003-08-28 15:32) [1]Насколько я помню Кернигана и Ричи - правило хорошего тона.
← →
Странник (2003-08-28 16:07) [2]Никто ничего никому не обязан.
Учитывается только соглашения о наименованиях в пределах проекта.
← →
Digitman (2003-08-28 16:25) [3]Т.е. посему можно сделать следующий вывод :
Ни один C-лексер не в состоянии автономно определить, является ли очередная лексема в потоке именем или синонимом в определении типа ... Только - в тесном взаимодействии с машиной состояния C-парсера
Скажите, что я неправ)
← →
Fantasist (2003-08-29 00:37) [4]
> Обязан ли (в соответствии с ANSI C/C++) идентификатор_синоним
> содержать (кроме прочих допустимых спецсимволов а-ля _ ,
> * ) символы исключительно верхнего регистра ?
Не обязан.
> Или практика написания синонима в верхнем симв.регистре
> - лишь умалчиваемое "правило хорошего тона" ?
Для typedef такого "правила хорошего тона", в общем-то, никогда не было, если мы говорим о С++. Наименование в верхнем регистре очень настоятельно рекомендуется использовать для макросов и только для них. И это обусловлено не столько "хорошим тоном", сколько вполне объективной пользой от такого соглашения. Дело в том, что макроподстановки выполняются препроцессором, а следовательно никакого анализа при подстановке не происходит - текст просто заменяется незаметно для пользователя. И не раз люди уже наступали на грабли, когда имя макроса случайно совпадало с каким-то индификатором, после чего компилятор выдает непонятные ошибки. Как-то у меня по неопытности было:
#ifndef OWR
#define OWR
namespace OWR
{
class A
{
.....
}
}
#endif
где-нибудь в другом модуле:
{
OWR::A objectA;
}
И ошибка компиляции на эту строчку - "A" does not exists in "global namespace". Долго не мог понять, при чем тут "global namespace".
> Ни один C-лексер не в состоянии автономно определить, является
> ли очередная лексема в потоке именем или синонимом в определении
> типа ... Только - в тесном взаимодействии с машиной состояния
> C-парсера
>
> Скажите, что я неправ)
Однако, ты прав. Не знаю, что подразумевалось под "машиной состояния C-парсера", однако действительно, нельзя определить является ли лексема индификатором только по ее внешнему виду. В общем случае, придется проводит полный анализ (лексический, синтаксический и семантический), однако, если предпологать, что синтаксис и семантика в исходном тексте корректны, то достадочно лишь найти комментарии и эти typedef"ы. Почти то же самое, что делает препроцессор.
← →
Digitman (2003-08-29 08:48) [5]попробую прокомментировать все это фрагментом исх.авторского кода в файле CPP5.L (исх.лексика для ANSI C/C++)
Copyright (C) 1989-1991 James A. Roskind, All rights reserved
/* определения */
...
{%
...
#define IDENTIFIER_RETURN() RETURN_VAL(isaTYPE
(yytext)?TYPEDEFname:IDENTIFIER)
...
%}
...
identifier [a-zA-Z_][0-9a-zA-Z_]*
...
%%
/* лексические правила */
.... по приоритету здесь идут правила для ключевых слов
{identifier} {IDENTIFIER_RETURN();}
... и т.д., в порядке уменьшения приоритета
%%
/* вспомогательные процедуры */
...
int isaTYPE(string) /* */
char * string;
{
/* We should really be maintaining a symbol table, and be
carefully keeping track of what the current scope is (or in the
case of "rescoped" stuff, what scope to look in). Since the
grammar is not annotated with actions to track transitions to
various scopes, and there is no symbol table, we will supply a
hack to allow folks to test the grammar out. THIS IS NOT A
COMPLETE IMPLEMENTATION!!!! */
return ("A" <= string[0] && "Z" >= string[0]);
}
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c