как решается такая задачка ?
От: std_out  
Дата: 04.01.10 12:31
Оценка:
В текстовом файле записана (без ошибок) некоторая программа на языке C (или Паскаль, по выбору). Напечатать в алфавитном порядке все различные введенные программистом идентификаторы этой программы, указав для каждого из них в возрастающем порядке номера строк текста, в которых он встречается, а также его тип. Учесть, что в идентификаторах одноименные прописные и строчные буквы отождествляются (или нет, опционально), что внутри литерных значений, строк — констант комментариев последовательности из букв и цифр не являются идентификаторами и что в записи вещественных чисел может встретиться буква Е или е.
Для хранения идентификаторов и номеров строк используйте деревья.
Posted via RSDN NNTP Server 2.1 beta
Re: как решается такая задачка ?
От: deniok Россия  
Дата: 04.01.10 12:36
Оценка:
Такая задачка решается парсингом.
Re: как решается такая задачка ?
От: Аноним  
Дата: 04.01.10 12:38
Оценка:
Здравствуйте, std_out, Вы писали:

_>В текстовом файле записана (без ошибок) некоторая программа на языке C (или Паскаль, по выбору)...


А ты что, на занятия вообще не ходишь?
Re[2]: как решается такая задачка ?
От: std_out  
Дата: 04.01.10 13:13
Оценка:
> А ты что, на занятия вообще не ходишь?
Я, батенька, свои занятия уже несколько лет как закончил.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: как решается такая задачка ?
От: std_out  
Дата: 04.01.10 13:13
Оценка:
> Такая задачка решается парсингом.
Это я помню, но вот как именно ...
Увы, за давностью лет позабыл ;(
Какой метод тут ?

Это что же, мне придется грамматику для разбираемого языка написать ?
Posted via RSDN NNTP Server 2.1 beta
Re[3]: как решается такая задачка ?
От: 31415926 Россия  
Дата: 04.01.10 14:53
Оценка:
Здравствуйте, std_out, Вы писали:

>> Такая задачка решается парсингом.

_>Это я помню, но вот как именно ...
_>Увы, за давностью лет позабыл ;(
_>Какой метод тут ?

_>Это что же, мне придется грамматику для разбираемого языка написать ?


"Все уже украдено до нас"
Re: как решается такая задачка ?
От: gh2  
Дата: 05.01.10 11:26
Оценка:
Здравствуйте, std_out, Вы писали:

_>В текстовом файле записана (без ошибок) некоторая программа на языке C (или Паскаль, по выбору). Напечатать в алфавитном порядке все различные введенные программистом идентификаторы этой программы, указав для каждого из них в возрастающем порядке номера строк текста, в которых он встречается, а также его тип. Учесть, что в идентификаторах одноименные прописные и строчные буквы отождествляются (или нет, опционально), что внутри литерных значений, строк — констант комментариев последовательности из букв и цифр не являются идентификаторами и что в записи вещественных чисел может встретиться буква Е или е.

_>Для хранения идентификаторов и номеров строк используйте деревья.

1) Выбираем тул для генерации парсера с прицелом на то, чтобы найти под него уже написанную грамматику Си. Выше предлагали antlr, (устаревшей) классикой является сочетание flex + yacc (можете в драгон буке подсмотреть использование этой связки). Можете у gcc фронтенд отрезать, если осилите
2) Если получаете LR или LRLA грамматику, в действиях свертки соотв-го нетерминала у вас под рукой будут и имя переменной и ее тип.
3) Генерите парсер.
Re[2]: как решается такая задачка ?
От: 31415926 Россия  
Дата: 05.01.10 11:48
Оценка:
Здравствуйте, gh2, Вы писали:

gh2>Здравствуйте, std_out, Вы писали:


_>>В текстовом файле записана (без ошибок) некоторая программа на языке C (или Паскаль, по выбору). Напечатать в алфавитном порядке все различные введенные программистом идентификаторы этой программы, указав для каждого из них в возрастающем порядке номера строк текста, в которых он встречается, а также его тип. Учесть, что в идентификаторах одноименные прописные и строчные буквы отождествляются (или нет, опционально), что внутри литерных значений, строк — констант комментариев последовательности из букв и цифр не являются идентификаторами и что в записи вещественных чисел может встретиться буква Е или е.

_>>Для хранения идентификаторов и номеров строк используйте деревья.

gh2>1) Выбираем тул для генерации парсера с прицелом на то, чтобы найти под него уже написанную грамматику Си. Выше предлагали antlr, (устаревшей) классикой является сочетание flex + yacc (можете в драгон буке подсмотреть использование этой связки). Можете у gcc фронтенд отрезать, если осилите

gh2>2) Если получаете LR или LRLA грамматику, в действиях свертки соотв-го нетерминала у вас под рукой будут и имя переменной и ее тип.
gh2>3) Генерите парсер.

Кстати — если говорить о C, то существует, как минимум, одно осложнение, связанное с макросами и include'ами. Считать ли переменные, определенные посредством этих механизмов "введенными программистом"?
Re[3]: как решается такая задачка ?
От: gh2  
Дата: 06.01.10 05:13
Оценка:
Здравствуйте, 31415926, Вы писали:

3>Кстати — если говорить о C, то существует, как минимум, одно осложнение, связанное с макросами и include'ами. Считать ли переменные, определенные посредством этих механизмов "введенными программистом"?


Наверное об этом нужно спросить автора задачи, IMHO скорее всего она чисто академическая, и исходники не подвергаются препроцессингу и не предполагают успешности линковки. В любом случае, есть разумные стратегии для решения задачи с препроцессингом (не составит труда ввести в грамматику синтезируемый атрибут, устанавливаемый при раскрытии, например, макроса) и без (очевидно).
Re[3]: как решается такая задачка ?
От: Панда Россия  
Дата: 06.01.10 15:45
Оценка:
Здравствуйте, std_out, Вы писали:

_>Это что же, мне придется грамматику для разбираемого языка написать ?


По-моему, тут будет достаточно лексического анализа, причем очень примитивного (потому что нас интересуют только две лексемы — "идентификатор" и "не идентификатор", а текст разбираемой программы гарантированно корректный). Можно сделать на коленке, без применения научных подходов. Просто нарисовать конечный автомат на бумажке и захардкодить.
Re: как решается такая задачка ?
От: LaptevVV Россия  
Дата: 11.01.10 06:25
Оценка:
Здравствуйте, std_out, Вы писали:

_>В текстовом файле записана (без ошибок) некоторая программа на языке C (или Паскаль, по выбору). Напечатать в алфавитном порядке все различные введенные программистом идентификаторы этой программы, указав для каждого из них в возрастающем порядке номера строк текста, в которых он встречается, а также его тип. Учесть, что в идентификаторах одноименные прописные и строчные буквы отождествляются (или нет, опционально), что внутри литерных значений, строк — констант комментариев последовательности из букв и цифр не являются идентификаторами и что в записи вещественных чисел может встретиться буква Е или е.

_>Для хранения идентификаторов и номеров строк используйте деревья.
ИМХО, можно обойтись без тяжелой артиллерии.
Нас действительно интересуют только два состояния: начался идентификатор, кончился идентификатор. Разделим множество всех символов на три: символы, с которых может начинаться идентификатор, символы, которые могут входить в идентификатор и символы, которые не могут входить в идентификатор.
При обнаружении символа, начинающего идентификатор, начинаем прицеплять символы к строке до первого символа, который входить не может.
Но потом набранный ид-р нужно сравнить с ключевыми словами.
Правда, если нужно учитывать вложенность, то я б выбрал паскаль — там процедуры и функции объявляются с помощью ключевого слова.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: как решается такая задачка ?
От: maykie Россия  
Дата: 11.01.10 10:36
Оценка: +1
Здравствуйте, LaptevVV, Вы писали:

LVV>Но потом набранный ид-р нужно сравнить с ключевыми словами.

LVV>Правда, если нужно учитывать вложенность, то я б выбрал паскаль — там процедуры и функции объявляются с помощью ключевого слова.

Не получится без тяжелой артилерии.

int (*foo)(const struct* boo);


По условию задачи тип int (*)(const struct* boo) надо вытащить.
Re[3]: как решается такая задачка ?
От: LaptevVV Россия  
Дата: 11.01.10 12:03
Оценка:
Здравствуйте, maykie, Вы писали:

M>Здравствуйте, LaptevVV, Вы писали:


LVV>>Но потом набранный ид-р нужно сравнить с ключевыми словами.

LVV>>Правда, если нужно учитывать вложенность, то я б выбрал паскаль — там процедуры и функции объявляются с помощью ключевого слова.
M>Не получится без тяжелой артилерии.
M>
M>int (*foo)(const struct* boo);
M>

M>По условию задачи тип int (*)(const struct* boo) надо вытащить.
Именно поэтому поиск в паскале проще — там ключевые слова есть procedure и function
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: как решается такая задачка ?
От: Erop Россия  
Дата: 15.01.10 23:35
Оценка:
Здравствуйте, maykie, Вы писали:

M>По условию задачи тип int (*)(const struct* boo) надо вытащить.


а ещё ведь и typedefs бывают...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.