Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-58771
muzik
2003-09-08 13:19
2003.09.18
FORM - как компонент?


3-58580
Serg De
2003-08-26 15:54
2003.09.18
Формат даты в SQL


3-58533
andy-ivt
2003-08-28 12:52
2003.09.18
Доступ к БД IB по сети


3-58528
Юля П
2003-08-28 10:14
2003.09.18
Правильно посчитать отчет


1-58642
Marmel
2003-09-05 11:53
2003.09.18
Перехватить информацию из ячейки Exel.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский