Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизЧто такое идентификатор по правилам Object Pascal? Найти похожие ветки
← →
Antonn © (2005-08-27 12:12) [0]Наткнулся на задание лабораторной работы:
"Дан текст, выяснить, является ли этот текст идентификатором (по правилам Object Pascal)."
Может это и глупо, но не знаю я, что относится к идентификатору, соответственно зание не могу выполнить. Подскажите, что это?
← →
begin...end © (2005-08-27 12:20) [1]Справка, статья Identifiers:
Identifiers denote constants, variables, fields, types, properties, procedures, functions, programs, units, libraries, and packages. An identifier can be of any length, but only the first 255 characters are significant. An identifier must begin with a letter or an underscore (_) and cannot contain spaces; letters, digits, and underscores are allowed after the first character. Reserved words cannot be used as identifiers.
← →
Antonn © (2005-08-27 12:23) [2]begin...end © (27.08.05 12:20) [1]
хм, тогда само задание не пойму. Получается каждое не слово, с латинскими символами, является идентификатором?
← →
Antonn © (2005-08-27 12:24) [3]Antonn © (27.08.05 12:23) [2]
Получается каждое не слово
не удалить
← →
Джо © (2005-08-27 12:30) [4]
> [2] Antonn © (27.08.05 12:23)
> begin...end © (27.08.05 12:20) [1]
> хм, тогда само задание не пойму. Получается каждое не слово,
> с латинскими символами, является идентификатором?
Нет. Читать [1] до окончательного понимания :)
← →
begin...end © (2005-08-27 12:31) [5]> Antonn © (27.08.05 12:23) [2]
Нет.
Текст является идентификатором, если:
а) первым его символом является латинская буква или символ подчёркивания;
б) последующие символы (если они есть) являются латинскими буквами, символами подчёркивания или цифрами;
в) текст не совпадает (регистронезависимо) ни с одним из зарезервированных слов.
← →
Джо © (2005-08-27 12:32) [6]Например слово "unit" хотя и удовлетворяет
> An identifier must begin with a letter or an underscore
> (_) and cannot contain spaces; letters, digits, and underscores
> are allowed after the first character
но не удовлетворяет
> Reserved words cannot be used as identifiers.
В общем, читать, читать и читать.
← →
begin...end © (2005-08-27 12:34) [7][5] следует пониамть, конечно, в том смысле, что должны выполняться все три пункта. Эти условия и нужно проверять.
← →
Antonn © (2005-08-27 12:57) [8]Джо © (27.08.05 12:30) [4]
Нет. Читать [1] до окончательного понимания :)
в английском не силен, тем более что нужно принциально точно перевести и понять.
begin...end © (27.08.05 12:31) [5]
спасибо, разобрался.
← →
Anatoly Podgoretsky © (2005-08-27 13:18) [9]Джо © (27.08.05 12:30) [4]
Читать не 1, а 0 до полного просветления, а 1 использовать для решения указанной задачи.
← →
Antonn © (2005-08-27 15:22) [10]Anatoly Podgoretsky © (27.08.05 13:18) [9]
а что в [0]? без [5] я не сразу понял, что к чему
← →
Anatoly Podgoretsky © (2005-08-27 15:40) [11]В 0 описание задачи, в 1 описание того, что является идентификатором и каким правилам он должен соответсвовать. Этого достаточно, что бы за несколько минут реализовать задание.
← →
Anatoly Podgoretsky © (2005-08-27 15:41) [12]Ах ла, в 5 перевод на русский язык, возможно не полный.
← →
Antonn © (2005-08-27 15:41) [13]без понятия в [1] читать [0] до полного просветления смысла нет.
← →
Anatoly Podgoretsky © (2005-08-27 15:48) [14]Это уже философия, но главное в 0, а в 1 только спецификация и к тому же это просто вырезка из стандартной справки. Прочитав внимательно и понял 0, можно дальше смотреть спецификацию в оригинале.
Сама задача подчеркиваю элементарная. Один цикла и серия IF и особого интереса не представляет. Вся сложность в понимании задания, что от тебя хочет предподователь. Недеюсь, что речь не идет о работодателе.
← →
Antonn © (2005-08-27 16:06) [15]Anatoly Podgoretsky © (27.08.05 15:48) [14]
> Прочитав внимательно и понял 0,
я понял, что без понимания "идентификатор" далеко не уеду. И так ясно, что надо сравнивать, не понятны были условия, налагаемые "идентификатором". Сбило с толку то, что в условии задается не одно слово (там для 10 заданий давался один текст), а предложение.
Кстати, есть ли стандартная функция, позволяющая узнать, является ли слово зарезервированым? я пока обхожусь if и pos, но вдруг опять велосипедом пользуюсь...
← →
begin...end © (2005-08-27 16:14) [16]> Antonn © (27.08.05 16:06) [15]
> Кстати, есть ли стандартная функция, позволяющая узнать, является ли слово зарезервированым?
Нет.
> я пока обхожусь if и pos
Я бы использовал константный массив и функцию AnsiIndexText из модуля StrUtils.
← →
Anatoly Podgoretsky © (2005-08-27 16:15) [17]Antonn © (27.08.05 16:06) [15]
Правильно понял и в задании явно было сказано (по правилам Object Pascal) - это ключевая фраза, по ней ты должен был посмотреть эти правила. Посмотрев их у тебя не осталось бы вопросов, поскольку они сформулированы однозначно.
Одно из правил гласит - только одно слово в идентификаторе
Стандартная функция есть, она зашита в дебрях компилятора и наружу не выдается, да и пользы от нее мало, поскольку правила меняются от версии к версии. Это кроме того означает, что при решении задания ты должен опубликовать правила. Иначе возможно несогласование представлений о идентификаторах между тобой и предподователем.
← →
Antonn © (2005-08-27 16:33) [18]Anatoly Podgoretsky © (27.08.05 16:15) [17]
посмотреть эти правила. Посмотрев их
негде смотреть, только Ф1 в Delphi, а там по англицки, а учитывая
> Сбило с толку то, что в условии задается не одно слово
> (там для 10 заданий давался один текст), а предложение.
и
> в английском не силен, тем более что нужно принциально
> точно перевести и понять.
потому и сюда обратился.
> Одно из правил гласит - только одно слово в
> идентификаторе
это я знал, но в условии давалось предложение, вот у меня в возникло AV:)
В общем, пусть сам преподаватель разбирается, как с предложением быть, я сделал для одного слова.
begin...end © (27.08.05 16:14) [16]
Я бы использовал константный массив и функцию AnsiIndexText из модуля StrUtils.
может покажусь наглым, но можно пример?
я вот такую конструкцию собрал:function Reserved(s:string):boolean;
var _b:boolean;
begin
if pos("["+lowercase(s)+"]","[div][dispinterface][destructor][constructor]"
+"[class][asm][as][array][or][label][else][div][implementation]"
+"[interface][const][and][downto][not][in][uses][begin][end][end]"
+"[case][of][if][procedure][function][var][then][asm][for][to][do]"
+"[while][until][string]")> 0 then _b:=true else _b:=false;
if not(_b) then
if pos("["+lowercase(s)+"]","[string][set][shl][shr][resourcestring][raise]"
+"[record][repeat][property][program][packed][out][library][mod][is]"
+"[inline][nil][interface][initialization][object][inherited]"
+"[implementation][except][exports][file][finalization][finally]"
+"[goto]")> 0 then _b:=true else _b:=false;
if not(_b) then
if pos("["+lowercase(s)+"]","[xor][with][until][unit][type][try][threadvar]")> 0
then _b:=true else _b:=false;
result:=_b;
end;
← →
Джо © (2005-08-27 16:41) [19]
> [18] Antonn © (27.08.05 16:33)
Это потенциальный глюкогенератор, а ну функция :)
Для отсечения зарезервированных слов можно сделать совсем просто. Создай текстовый файл со списком этих слов, каждое слово на новой строке, все символы в ВЕРХНЕМ РЕГИСТРЕ. Затем создаешь экземпляр TStringList. Загружаешь в него файл - Lst.LoadFromFile(...). Проверка на зарезервированное слово выглядит в таком случае просто до безобразия:Reserved := Lst.IndexOf(UpperCase(Slovo)) <> -1;
И всё :)
← →
Джо © (2005-08-27 16:43) [20]Кроме того, обрати внимание на [17] Anatoly Podgoretsky © в плане того, что не забудь предоставить преподавателю текстовый файл с этим самым списком. Ибо reserved words зависят от версии компилятора.
← →
begin...end © (2005-08-27 16:58) [21]> Antonn © (27.08.05 16:33) [18]
Для Delphi 7 я бы использовал примерно такой код:uses StrUtils;
function IsValidIdentifier(const Text: string): Boolean;
const
ValidSymbols = ["a".."z", "A".."Z", "0".."9", "_"];
FirstSymbols = ValidSymbols - ["0".."9"];
ReservedWords: array [1..65] of string =
("and", "array", "as", "asm",
"begin",
"case", "class", "const", "constructor",
"destructor", "dispinterface", "div", "do", "downto",
"else", "end", "except", "exports",
"file", "finalization", "finally", "for", "function",
"goto",
"if", "implementation", "in", "inherited", "initialization", "inline", "interface", "is",
"label", "library",
"mod",
"nil", "not",
"object", "of", "or", "out",
"packed", "procedure", "program", "property",
"raise", "record", "repeat", "resourcestring",
"set", "shl", "shr", "string",
"then", "threadvar", "to", "try", "type",
"unit", "until", "uses",
"var",
"while", "with",
"xor");
var
I, L: Integer;
begin
L := Length(Text);
// 1. Text не должен быть пустым, и его первый символ должен входить во множество FirstSymbols
Result := (L > 0) and (Text[1] in FirstSymbols);
// 2. Все символы Text, стоящие после первого, должны входить во множество ValidSymbols
I := 2;
while (I <= L) and Result do
begin
Result := Text[I] in ValidSymbols;
Inc(I)
end;
// 3. Text не должен находиться среди строк ReservedWords
Result := Result and (AnsiIndexText(Text, ReservedWords) = -1)
end.
Однако следует обратить внимание на то, что некоторые слова могут считаться зарезервированными лишь при определённых обстоятельствах (об этом тоже написано в справке). Например, слово private является зарезервированным в контексте описания класса. Это, в частности, означает, что обычную переменную с именем private объявить можно, а поле класса с таким именем -- нет. Поэтому нужно решить, как быть в этом случае, и, возможно, подкорректировать массив ReservedWords.
← →
Antonn © (2005-08-27 17:11) [22]Джо © (27.08.05 16:41) [19]
Это потенциальный глюкогенератор, а ну функция :)
попрошу указать, где это она глючная:)
И почему метод в [19] лучше.
begin...end © (27.08.05 16:58) [21]
попробывал только для опреления резервированых(через QueryPerformanceCounter) - у меня быстрее:)
← →
Antonn © (2005-08-27 17:15) [23]begin...end © (27.08.05 16:58) [21]
я, кстати, сделал так:function Reserved(s:string):boolean; из [18]
function GetSlovoIdentifier(s:string):boolean;
var i:integer;
begin
result:=false;
if not(Reserved(s)) then begin
if not(s[1] in ["a".."z","A".."Z","_"]) then exit;
for i:=1 to length(s) do
if not(s[i] in ["a".."z","A".."Z","_","0".."9"]) then exit;
result:=true;
end;
end;
← →
begin...end © (2005-08-27 17:19) [24]> Antonn © (27.08.05 17:11) [22]
> у меня быстрее
Я не ставил своей целью написать наиболее быструю функцию, решающую данную задачу. Своё решение я не навязываю. Хотите -- пользуйтесь, хотите -- нет.
> Antonn © (27.08.05 17:15) [23]
Не учтён случай пустой строки s.
← →
Antonn © (2005-08-27 17:26) [25]begin...end © (27.08.05 17:19) [24]
Не учтён случай пустой строки s.
угу, не делал, потому что в задании дается "непустая последовательность символов"
← →
Anatoly Podgoretsky © (2005-08-27 18:13) [26]Если говорить об оптимальности, то обе плохии, но об оптимальности вопрос не стоял.
Главное чтобы правильно работало.
Даже в последнем варианте до оптимальности далеко.
Одно только
if not(s[1] in ["a".."z","A".."Z","_"]) then exit;
перенесеное на строку выше даст большой прирост.
и цикл не с 1 а с 2 тоже даст прирост.
Но не будете же вы мериться оптимальностью?
← →
Anatoly Podgoretsky © (2005-08-27 18:15) [27]Пропущено ценное предложение [19], решающее и документирование правил и быстродействие и расширяемость без переделки программы.
← →
Antonn © (2005-08-27 18:39) [28]Anatoly Podgoretsky © (27.08.05 18:15) [27]
Пропущено ценное предложение [19], решающее и документирование правил и быстродействие и расширяемость без переделки программы.
это при условии, что нужна расширяемость без переделки. В моем задании все должно содержаться в программе, без дополнительных внешних файлов.
← →
Anatoly Podgoretsky © (2005-08-27 19:56) [29]И скорость
Lst.IndexOf(UpperCase(Slovo)) <> -1;
и разделение данных и логики.
А также независимость. Можно использовать для разных языков с близкими правилами или разных версий одного языка. Данные не обязательно должны быть в файле.
← →
GuAV © (2005-08-28 01:20) [30]
> В моем задании все должно содержаться в программе,
> без дополнительных внешних файлов.
Можно записать в ресурс и грузить TStrings.LoadFromStream
← →
Antonn © (2005-08-28 04:53) [31]GuAV © (28.08.05 1:20) [30]
Можно записать в ресурс и грузить TStrings.LoadFromStream
ну не можно, говорю же. меня за использование процедур(в смысле, когда не в TButtonOnClick код) гоняют... Это так вообще идиотизм, имхо.
← →
Anatoly Podgoretsky © (2005-08-28 10:51) [32]Смени институт, ничему хорошему там тебя не научат.
← →
Antonn © (2005-08-28 12:03) [33]Anatoly Podgoretsky © (28.08.05 10:51) [32]
уже поздно, иду на 5 курс. Да и Дельфи тут изучают для ознакомления, всего семестр(а результат уже виден:)).
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.015 c