Таметко.
Сообщений 1 страница 11 из 11
Поделиться223-08-2009 15:22:42
Уважаемый Данил!
Не могли Вы изложить хотя бы кратко, не сочтите за труд, хоть какие-то идеи, которые Вас осенили? Что Вы хотите привнести нового в языки программирования? Каковы черты того языка, для которого Вы собираетесь сделать компилятор? В чём Вы видите миссию своего языка?
Пока что приходится констатировать, что число пользователей языков программирования, созданных отечественными одиночками-энтузиастами, не намного превышает число самих языков. За счёт чего Вы собираетесь переломить такую закономерность? В чём "фишка", которая привлечёт сначала любопытных, а затем более широкие слои программистской общественности?
С нетерпением жду Вашего ответа.
Отредактировано Юрий (23-08-2009 18:29:06)
Поделиться326-08-2009 22:29:30
---------- Это с сайта -----
1. Основная цель проекта "Таметко" - создание языка программирования с русским синтаксисом.
2. Целевая платформа для языка - .Net (Windows), Mono (Linux, Mac, Windows).
3. Инструмент для создания языка - Coco/R C# .
Используемые файлы.
Модифицированная версия Coco/R.
Генератор компилятора.
Важно: работает с файлами, только в кодировке UTF-8.
Coco.exe - запускной файл.
Coco.exe.zip - сжатый запускной файл.
Исходный код.
Coco.r.src.zip
Файл описания языка "Таметко".
Используется как входной файл для Coco/R.
В основном вся информация в нём.
Tametko.atg (в разработке, имеет кодировку UTF-8).
Что нужно знать.
1. Основы работы платформы .Net.
2. Язык программирования C#.
3. Принципы работы Генератора компиляторов Coco/R.
Что надо уметь.
1. Пользоваться командной строкой.
2. Пользоваться текстовым редактором (поддерживающим UTF-8).
Поделиться426-08-2009 22:32:32
Файл Таметко.atg
#region Объявление Используемых Пакетов
// Используется Coco/R.
// Вставляется в созданый файл.
using System.Collections;
#endregion
COMPILER Таметко
// Используется Coco/R.
// Вставляется в созданый файл.
// Возвращает н-ный токен от текущего токена
Token Заглянуть (int номер) {
scanner.ResetPeek();
Token токен = la;
while (номер > 0) { токен = scanner.Peek(); номер--; }
return токен;
}
//
#region Глобальные Типы Методы Поля
// Это Имя Типа
bool ЭтоИмяТипа (ref Token pt) {
if(pt.kind == _идентификатор )
{
pt = scanner.Peek();
if( pt.kind == _двадвоеточия)
{
pt = scanner.Peek();
if (pt.kind != _идентификатор)
{
return false;
}
pt = scanner.Peek();
}
while(pt.kind == _точка)
{
pt = scanner.Peek();
if (pt.kind != _идентификатор)
{
return false;
}
}
return true;
}
else
return false;
}
bool ЭтоПриведениеКТипу()
{
scanner.ResetPeek();
if (la.kind != _леваяскобка)
{ return false; }
Token pt = scanner.Peek();
if (!ЭтоИмяТипа(ref pt)) {
return false;
}
if (pt.kind != _праваяскобка) {
return false;
}
return true;
}
bool ЭтоПрисвоение()
{
return la.kind == _идентификатор && Заглянуть(1).kind == _равно;
}
bool ЭтоПространствоИмен()
{
return la.kind == _идентификатор && Заглянуть(1).kind == _двадвоеточия;
}
void Ошибка (string строкаОшибки) {
if (errDist >= minErrDist) errors.SemErr(la.line, la.col, строкаОшибки);
errDist = 0;
}
#endregion
/*------------------------------------------------------------------------*
*----- Описание сканера ----------------------------------------------*
*------------------------------------------------------------------------*/
CHARACTERS
#region Наборы символов
таб = '\u0009'. /* 9 */
конецСтроки = '\u000a'. /* 10 */
возвратКаретки = '\u000d'. /* 13 */
новаяСтрока = возвратКаретки + конецСтроки.
СтартовыйСимволИдентификатора = 'A' .. 'Z' + 'a' .. 'z' + '_' + 'А' .. 'я' +'ё' + 'Ё'.
СимволИдентификатора = '0' .. '9' + 'A' .. 'Z' + 'a' .. 'z' + '_' + 'А' .. 'я' +'ё' + 'Ё'.
число = "0123456789".
шестьНадЦатьЧиселЛатиница = число + "ABCDEFabcdef".
шестьНадЦатьЧиселПоРусски = число + "ЦОДТЧПцодтчп".
неЦифра = ANY - число.
символЗнак = ANY - новаяСтрока.
символТекста = ANY - '"'.
символСтроки = ANY - '"' - новаяСтрока.
неНоваяСтрока = ANY - новаяСтрока .
пробельныеСимволы = " " + таб + '\u000b' + '\u000c'. /* */
#endregion
TOKENS
#region Наборы Токенов
идентификатор =
// Знак "!" используется когда имя идентификатора совпадает с ключевым словом.
['!']
СтартовыйСимволИдентификатора
{
СимволИдентификатора
}
.
/*--------------------------------------------------------------------------------*/
целое =
число { число }
// Используется для русского написания шестнадцатеричного числа.
| (( "0х" | "0Х" ) шестьНадЦатьЧиселПоРусски { шестьНадЦатьЧиселПоРусски })
| (( "0x" | "0X" ) шестьНадЦатьЧиселЛатиница { шестьНадЦатьЧиселЛатиница })
.
/*--------------------------------------------------------------------------------*/
вещественное = число {число} ( "," число {число} ).
/*--------------------------------------------------------------------------------*/
// написание символа !"в"
символ = "!" "\"" ( символЗнак | "\"\"" ) "\"".
/*--------------------------------------------------------------------------------*/
строка = "\"" { символТекста | "\"\"" } "\"".
/*---------------------------------------------------------------------------------*/
#endregion
/*----- зарезервированные ключевые слова -----*/
#region Ключевые слова
внешний = "внешний".
сборка = "сборка".
модульслово = "модуль".
пакет = "пакет".
пакета = "пакета".
импорт = "импорт".
импорта = "импорта".
класс = "класс".
класса = "класса".
метод = "метод".
метода = "метода".
атрибут = "атрибут".
доступ = "доступ".
статический = "статический".
открытый = "открытый".
закрытый = "закрытый".
внутренний = "внутренний".
защищённый = "защищённый".
расширяет = "расширяет".
реализует = "реализует".
возврат = "возврат".
конструктор = "конструктор".
оператор = "оператор".
да = "да".
нет = "нет".
начало = "начало".
конец = "конец".
если = "если".
тогда = "тогда".
иначе = "иначе".
выбор = "выбор".
из = "из".
вариант = "выриант".
выбрать = "выбрать".
выбора = "выбора".
пока = "пока".
цикл = "цикл".
цикла = "цикла".
прервать = "прервать".
продолжить = "продолжить".
выбросить = "выбросить".
защита = "защита".
завершить = "завершить".
защиты = "защиты".
исключение = "исключение".
этот = "этот".
родитель = "родитель".
новый = "новый".
размер = "размер".
или = "или".
и = "и".
ИЛИ = "ИЛИ".
ИСКЛЮЧИТЬ = "ИСЛЮЧИТЬ".
И = "И".
ИНВЕРТИРОВАТЬ = "ИНВЕРТИРОВАТЬ".
неравно = "<>".
не = "не".
равно = "=".
равнослово = "равно".
меньше = "<".
больше = ">".
меньшеслово = "меньше".
большеслово = "больше".
плюс = "+".
минус = "-".
умножить = "*".
разделить = "/".
модуль = "%".
точка = ".".
запятая = ",".
двоеточие = ":".
точкасзапятой = ";".
двадвоеточия = "::".
леваяскобка = "(".
праваяскобка = ")".
#endregion
PRAGMAS
#region Дерективы
ппОпределить = "%%" {пробельныеСимволы} "определить" {неНоваяСтрока} новаяСтрока. // (. AddCCS(la.val); .)
ппОтменить = "%%" {пробельныеСимволы} "отменить" {неНоваяСтрока} новаяСтрока. //(. RemCCS(la.val); .)
ппЕсли = "%%" {пробельныеСимволы} "если" {неНоваяСтрока} новаяСтрока. // (. IfPragma(la.val); .)
ппИначе = "%%" {пробельныеСимволы} "иначе" {пробельныеСимволы} новаяСтрока. //(. ElifOrElsePragma(); .)
ппИначеЕсли = "%%" {пробельныеСимволы} "иначе" {пробельныеСимволы} "если" {неНоваяСтрока} новаяСтрока. //(. ElifOrElsePragma(); .)
ппСтрока = "%%" {пробельныеСимволы} "строка" {неНоваяСтрока} новаяСтрока.
ппОшибка = "%%" {пробельныеСимволы} "ошибка" {неНоваяСтрока} новаяСтрока.
ппВнимание = "%%" {пробельныеСимволы} "внимание" {неНоваяСтрока} новаяСтрока.
ппОбласть = "%%" {пробельныеСимволы} "область" {неНоваяСтрока} новаяСтрока.
ппКонец = "%%" {пробельныеСимволы} "конец" {пробельныеСимволы} "если" {неНоваяСтрока} новаяСтрока.
ппКонецОбласти = "%%" {пробельныеСимволы} "конец" {пробельныеСимволы} "области" {неНоваяСтрока} новаяСтрока.
#endregion
//COMMENTS FROM "/*" TO "*/"
COMMENTS FROM "//" TO конецСтроки
IGNORE конецСтроки
IGNORE возвратКаретки
IGNORE таб
PRODUCTIONS
#region Таметко
// Компилятору Таметко на вход, как параметр командной строки подаётся каталог в котором находятся файлы на языке Таметко.
// Расширение папки "сборка".
// Всю дополнительную информацию компилятор берет из файлов и вложенных папок, находящихся в этом каталоге.
// Виды файлов используемые Таметко:
// 1. Файл описания параметров сборки, имеет имя объемлющего каталога и расширение "модуль".
// Может отсутствовать. Если отсутствует параметры сборки и текущего модуля, устанавливаются по умолчанию;
// 2. Файл описания типа, имеет произвольное имя (по правилам написания идентификаторов)имеет расширение "тип"
// например: "ИмяТипа.тип".
// Если имя типа начинается с "." тогда тип не виден из сборки т.е. он считается внутренним,
// и будет использоваться компилятором если на него будут ссылаться другие типы определнные в этой сборке.
// Может отсутствовать;
// 3. Файла вложенного типа. Пример: "ИмяТипа.ИмяВложенногоТипа.тип", имеет расширение "тип". Файл с типом владельцем
// должен существовать, в противном случае файл вложенного типа будет прпущен;
// 4. Вложенная Папка с расширением "пакет", имеет произвольное имя (по правилам написания идентификаторов)
// используется для описания пакетов используемых в данной сборке текущего модуля.
// Если имя Пакета начинается с "." тогда компилятор её пропускает и в сборке она не участвует;
// 5. Вложенная Папка с расширением "ресурсы", служит для хранения ресурсов (значки, музыкальные файлы и т.д.)
// используемых в сборке.
// Может отсутствовать;
// 6. Вложенная Папка с расширением "модуль", дополнительный модуль принадлежащий текущей сборке.
// Содержит описания Типов, ПодТипов, Пакетов, Ресурсов, а также файл с именем текущего модуля имеющим
// расширение "модуль", в котором находится описание параметров модуля.
// Может отсутствовать. Если отсутствует, параметры модуля устанавливаются по умолчанию.
// При компиляции будет создан отдельный файл.
// Может отсутствовать.
Таметко =
Сборка
(
Импорт
(
Модуль
|Тип
)
)
.
#endregion
#region ВнешнийПсевдоним
// Внешнее имя используемй сборки (псевдоним) передаётся через параметры командной строки в компилятор.
// пример /п:Форма=Формы.dll
ВнешнийПсевдоним =
{
"использовать" "сборку"
идентификатор "=" строка ";"
}
.
#endregion
#region Импорт
// Секция определения Импорта.
Импорт =
// Обязательное использование хотя бы одного импортируемого пакета,
// так как мы всегда используем ту или иную сборку и пакеты из неё.
СтрокаИмпортаПакета
{
СтрокаИмпортаПакета
}
.
#endregion
#region Строка Импорта Пакета
СтрокаИмпортаПакета =
"импорт"
// Псевдоним Пакета. Может отсутствовать .
[
IF(ЭтоПрисвоение()) идентификатор
"="
]
ИмяТипа ";"
.
#endregion
#region Имя Типа
ИмяТипа =
идентификатор
[
// если в переди псевдоним внешней сборки.
":::" идентификатор
]
{
"::" идентификатор
}
.
#endregion
#region Сборка
Сборка =
// Внешнее имя используемй сборки (псевдоним).
// Обязательно.
ВнешнийПсевдоним
// Область Импорта, обязательна, так как мы всегда используем ту или иную сборку и пакеты из неё.
[ Импорт ]
"сборка"
// Атрибут сборки.
// Может отсутствовать.
{
"(*"
{
АтрибутПользователя ";"
}
"*)"
}
// Имя сборки.
идентификатор
";"
.
#endregion
#region Модуль
Модуль =
"модуль"
// Атрибут сборки.
// Может отсутствовать.
{
"(*"
{
АтрибутПользователя ";"
}
"*)"
}
// Имя сборки.
идентификатор
";"
.
#endregion
#region Тип
// Описание Типов.
Тип =
Класс
//|Структура
//|Интерфейс
//|Перечисление
//|Делегат
.
#endregion
/////////////////////////////////////////
#region Класс
// Тип вида - Класс
// На ряду с внутренними членами, может иметь Вложенный Тип.
Класс =
"класс"
// Атрибуты класса: данные о классе.
{ АтрибутКласса }
идентификатор
"начало" ":"
{
Метод
//[ Свойство ]
//[ Оператор ]
//[ Поле ]
| "тип"
{
"(*"
АтрибутДоступа
"*)"
}
идентификатор ";"
}
"конец" "класса" ";"
.
#endregion
///////////////////////////////////////////////////// Атрибуты ////////////////////////////////////////////////////////
#region Атрибут Класса
АтрибутКласса =
"(*"
{
(
АтрибутДоступа
|АтрибутСтатический
|"абстрактный" "=" ( "да" | "нет" )
|"запечатанный" "=" ( "да" | "нет")
|"расширяет" "=" ИмяТипа
|"реализует" "=" ИмяТипа { "," ИмяТипа }
|АтрибутПользователя
)
";"
}
"*)"
.
#endregion
#region Атрибут доступа
АтрибутДоступа =
"доступ" "="
(
"внутренний"
| ( "защищённый" ["внутренний"] )
)
.
#endregion
#region Атрибут статический
АтрибутСтатический =
"статический" "=" ("да" | "нет")
.
#endregion
#region Атрибут виртуальный
АтрибутВиртуальный =
"виртуальный" "=" ( "да" | "нет")
.
#endregion
#region Атрибут Новый
АтрибутНовый =
"новый" "=" ( "да" | "нет" )
.
#endregion
#region Атрибут Переопределение
АтрибутПереопределение =
"переопределение" "=" ( "да" | "нет" )
.
#endregion
#region Атрибут Пользователя
АтрибутПользователя =
ИмяТипа [ АргументыАтрибута ]
.
#endregion
#region Агументы Атрибута
АргументыАтрибута (. bool именованныйПараметр = false; .)
=
"("
[
[IF(la.kind == _идентификатор && Заглянуть(1).kind == _равно)
идентификатор
"=" (. именованныйПараметр = true; .)
]
Выражение
{
","
(IF(la.kind == _идентификатор && Заглянуть(1).kind == _равно)
идентификатор
"=" (. именованныйПараметр = true; .)
| (. if (именованныйПараметр)
Ошибка("Позиционный параметр не может стоять за Именованным параметром.");
.)
)
Выражение
}
]
")"
.
#endregion
#region Атрибут Параметра
АтрибутПараметра =
"(*"
{
(
"тип" "=" ИмяТипа
|АтрибутПользователя
)
";"
}
"*)"
.
#endregion
#region Атрибут Возврата
АтрибутВозврата =
"(*"
{
(
"тип" "=" ИмяТипа
|АтрибутПользователя
)
";"
}
"*)"
.
#endregion
#region Атрибут Метода
АтрибутМетода
=
"(*"
{
АтрибутДоступа
|АтрибутСтатический
|АтрибутНовый
|АтрибутПереопределение
|("внешний" "=" ( "да" | "нет" ))
|АтрибутВиртуальный
|АтрибутПользователя
";"
}
"*)"
.
#endregion
/////////////////////////////////////////
#region Метод
//Метод объекта
//Есть два предопределенных имени метода: конструктор и оператор
Метод =
"метод"
{ АтрибутМетода }
( идентификатор | "конструктор" | "оператор" )
"("
[
"параметр"
{ АтрибутПараметра }
идентификатор
{ ","
"параметр"
{ АтрибутПараметра} идентификатор
}
]
")"
[
"возврат"
{ АтрибутВозврата }
]
"начало" ":"
{
Инструкция
}
"конец" "метода" ";"
.
#endregion
#region Переменная
// Переменные метода
Переменная =
"переменная"
"(*" [ "тип" "=" ИмяТипа [ ";" ] ] "*)"
идентификатор
[ "=" Выражение ]
";"
.
#endregion
#region Константа
//////////////////////////////////////////////
//Константа =
Константа =
"константа"
"(*" [ "тип" "=" ИмяТипа [ ";" ] ] "*)"
идентификатор
"=" Выражение
";"
.
#endregion
/*------------------------------------------------------------------------*
*------------------------------ Инструкции ------------------------------*
*------------------------------------------------------------------------*/
#region Инструкция
Инструкция
=
Константа
| Переменная
| ВложеннаяИнструкция
.
#endregion
#region Вложенная Инструкция
ВложеннаяИнструкция
=
";"
| ( ВыражениеИнструкция ";" )
| (
"если" Выражение "тогда" ":"
ВыражениеИнструкция
[ "иначе" ВыражениеИнструкция ] "конец" "если" ";"
)
| (
"выбор" "из" Выражение ":"
(
("вариант" Выражение ":")
| ("выбрать" ":")
)
Инструкция
"конец" "выбора" ";"
)
| (
"пока" Выражение "цикл" ":"
ВложеннаяИнструкция
"конец" "цикла" ";"
)
| (
"цикл" ":"
ВложеннаяИнструкция
"пока" Выражение "конец" "цикла" ";"
)
| (
"для"
( ИнициализаторДля "по" Выражение "шаг" ИтераторДля )
| ( "каждого" ИмяТипа идентификатор "из" Выражение )
"цикл" ":"
ВложеннаяИнструкция
"конец" "цикла" ";"
)
| "прервать" ";"
| "продолжить" ";"
| "возврат" [ Выражение ] ";"
| "выбросить" [ Выражение ] ";"
| (
"защита" ":"
{ Инструкция }
(
Исключение
[ "завершить" ":" { Инструкция } ] | "завершить" ":" { Инструкция }
)
"конец" "защиты" ";"
)
.
#endregion
#region Выражение Инструкция
ВыражениеИнструкция (. bool этоПрисваивание = la.kind == _плюс && la.kind == _минус && la.kind == _не &&
la.kind == _ИНВЕРТИРОВАТЬ && ЭтоПривидениеКТипу();
.)
=
Унарное
( "=" Выражение
| (. if (этоПрисваивание) Ошибка("Ошибка присваивания."); .)
)
.
#endregion
#region Вложенная Инструкция Инициализатор Для
ИнициализаторДля
=
Переменная
| ВыражениеИнструкция { "," ВыражениеИнструкция }
.
#endregion
#region Вложенная Инструкция итератор для
ИтераторДля
=
ВыражениеИнструкция { "," ВыражениеИнструкция }
.
#endregion
#region Вложенная Инструкция исключение
Исключение
=
"исключение"
( ":" Инструкция
| ИмяТипа [ идентификатор ] ":" Инструкция [ Исключение ]
)
.
#endregion
/*------------------------------------------------------------------------*
*----------------------------- Выражения ------------------------------*
*------------------------------------------------------------------------*/
#region Выражение
Выражение
=
Унарное
(
"=" Выражение
| илиВыражение
)
.
#endregion
#region Аргумент
Аргумент =
["ссылка" | "значение"]
Выражение
.
#endregion
#region Начальный
Начальный =
(
Литерал
| идентификатор
| "(" Выражение ")"
| "этот"
| "родитель" "." идентификатор
| "новый" ИмяТипа "(" [ Выражение { "," Выражение } ] ")"
| "размер" "(" ИмяТипа ")"
)
{
IF( la.kind == _точка || !ЭтоПревидениеКТипу() )
(
"." идентификатор
| ( "(" [ Аргумент { "," Аргумент } ] ")")
)
}
.
#endregion
#region Выражение или
илиВыражение
= ИВыражение {"или" Унарное ИВыражение}
.
#endregion
#region Выражение и
ИВыражение
= БитовоеИЛИВыражение {"и" Унарное БитовоеИЛИВыражение}
.
#endregion
#region Выражение Битовое ИЛИ
БитовоеИЛИВыражение
= БитовоеИСКЛЮЧИТЬВыражение {"ИЛИ" Унарное БитовоеИСКЛЮЧИТЬВыражение}
.
#endregion
#region Выражение Битовое ИСКЛЮЧИТЬ
БитовоеИСКЛЮЧИТЬВыражение
= БитовоеИВыражение {"ИСКЛЮЧИТЬ" Унарное БитовоеИВыражение}
.
#endregion
#region выражение Битовое И
БитовоеИВыражение
= РавенствоВыражение { "И" Унарное РавенствоВыражение }
.
#endregion
#region Выражение равенство, не равенство
РавенствоВыражение
= БольшеМеньшеВыражение
{ IF( la.kind == _не && Заглянуть(1).kind == _равно )
(("не" "равно") | "<>" )
Унарное
БольшеМеньшеВыражение
}
.
#endregion
#region Выражение больше меньше
БольшеМеньшеВыражение
= СдвигВыражение
{ IF( Заглянуть(1).kind == _или )
(
( ("меньше" "или" "равно") | "<=" )
| ( ("больше" "или" "равно") | ">=" )
)
|
(
( "меньше" | "<" )
| ( "больше" | ">" )
)
Унарное
СдвигВыражение
// | ("is" | "as") ResolvedType
}
.
#endregion
#region Выражение битовый сдвиг
СдвигВыражение
= СложениеВычитаниеВыражение
{ //IF (IsShift())
( ( "<<" | "ВЛЕВО" ) | ( ">>" | "ВПРАВО" ) )
Унарное
СложениеВычитаниеВыражение
}
.
#endregion
#region Выражение Сложение Вычитание
СложениеВычитаниеВыражение
= УмножениеДелениеМодульВыражение
{IF ( la.kind == _плюс && la.kind == _минус )
( "+" | "-" )
Унарное
УмножениеДелениеМодульВыражение
}
.
#endregion
#region Выражение умножение деление модуль
УмножениеДелениеМодульВыражение
= {("*" | "/" | "%") Унарное}
.
#endregion
#region Выражение унарное
Унарное
=
{
IF( la.kind == _плюс || la.kind == _минус || la.kind == _не || la.kind == _ИНВЕРТИРОВАТЬ || ЭтоПриведениеКТипу() )
( "+"
| "-"
| "не"
| "ИНВЕРТИРОВАТЬ"
| "(" ИмяТипа ")"
)
}
Начальный
.
#endregion
#region Литерал
Литерал
= целое | вещественное | символ | строка
.
#endregion
END Таметко.Поделиться528-08-2009 19:34:20
Я понял, что вы решили не использовать символы кириллицы ЎўЄєЇї, которые есть в других славянских языках: сербском, болгарском, украинском?
Поделиться629-08-2009 20:32:43
А какая надежность языка?
Поделиться710-09-2009 00:28:26
Содержимое сайта обновлено.
Таметко
Вопросы правомерные но на них ответа нет.

Поделиться823-09-2009 13:27:33
В распакованном архиве имена файлов и каталогов написаны "гречкой" - проблемы с кодировкой. Я смотрю из под Windows 7 Rus
Поделиться904-04-2010 20:07:17
Проблемы с "гречкой", устранил.
Перезагрузил файлы.
Пробовал открывать архивы в Windows и Linux.
У меня всё открылось нормально.
Поделиться1007-06-2012 06:47:44
какой то русский язык .а написано всё по иностранному.ура!гитлер рад.
Поделиться1107-06-2012 06:54:19
написано -методы поля- здеся где то .а какое поле .поле это ПОЛЕ.ерунда.надо полностью писать.это всё учителя виноваты .учили пушкина а он не кумекал по русски.надо говорить -скока,ежели и так подобно .а то нет слов и идёт нецензурщина.а почему матом а не патом?.вот почта та же.надо в почте чтоб всё по полочкам было письма от писцов чтоб класть по ячейкам и оно в слою ячейку идёт уже само .и смотриш тока ячейки .а то всё в 1 кучу.