Прошу прощения за объем, но многим может пригодиться....
/3.1
(Extension.1
Name: "Invent"
FirstRootClassName: "Choice"
Roots: 2
Roots: 3
Roots: 4
Roots: 5
Roots: 6
Roots: 7
Roots: 8
Roots: 9
Roots: 10
Version: 31
About: "Загружает в проект ArcView файлы типа in4 (v1.0)\nАндрей А. Дитковский, ГКП НИВЦ \"Градостроитель\""
InstallScript: 11
UninstallScript: 12
ExtVersion: 1
)
(Choice.2
Help: "Загрузить файлы типа 'in4'"
Label: "Load IN4..."
Click: "Invent.Load_IN4"
Shortcut: "Keys.None"
)
(Script.3
Name: "Invent.Analyse"
SourceCode: "'// Invent.Analyse (analyse.ave)\n'// \n'// Синтаксический анализатор.\n'// Модуль анализирует входной поток, преобразуя его во внутренние данные.\n'// Андрей А. Дитковский, ГКП НИВЦ \"Градостроитель\", тел. (0612) 33-10-51\n'// \n'// Функции связанные с работой данного модуля:\n'// Invent.GetToken - возвращает следующую лексему во входном потоке;\n'// Invent.Error - выдает сообщение об ошибке и завершает работу всех исполняющихся скриптов;\n'// Необходимые параметры:\n'// _lstIN4 - входной поток (список перекодиров
анных строк файла IN4);\n'// _lstObjType - список допустимых типов объектов;\n'// _lstObjParam - список допустимых параметров объектов;\n'// _lstPntParam - список допустимых параметров пункта;\n'// Использующиеся параметры:\n'// _LineCount - количество строк во входном потоке;\n'// _nCurLine - номер текущей разбираемой строки;\n'// _strCurLine - текущая разбираемая строка;\n'// _nCurPos - текущая позиция в разбираемой строке;\n'// _nTokenType - тип возвращаемой лексемы, если лексема не распознана возвращаетс
я -1;\n'// _strToken - содержит возвращаемую лексему;\n'// _nToken - содержит внутреннее представление лексемы являющейся параметром объекта,\n'// для остальных лексем принимает значение -1;\n'// По завершению работы анализатора, данные будут содержаться в списках:\n'// lstShpTypes - список типов загружаемых объектов;\n'// lstShpPoints - все загружаемые объекты;\n'// lstShpParam - семантика загружаемых объектов;\n'// lstAllNP - список имен всех загружаемых пунктов;\n'// lstAllPnt - все загружаемые
пункты.\n\nif ((_lstIN4 = nil) or (_lstObjType = nil) or (_lstObjParam = nil) or (_lstPntParam = nil)) then\n MsgBox.Error(\"Не инициализированны некоторые параметры !\", \"\")\n exit\nend\n\n'// Начальная инициализация модуля\n\n_LineCount = _lstIN4.Count\n_nCurLine = 0\n_strCurLine = _lstIN4.Get(_nCurLine)\n_nCurPos = 0\n\n_nTokenType = -1\n_strToken = \"\"\n_nToken = -1\n\nlstParVal = {}\nlstPntPar = {}\nlstPntParVal = {}\nlstPoints = {}\n\nfor each n in 0..(_lstObjParam.Count-1)\n lstParVal.Add(0)\nend\nfor each n in 0..(_lstPntPar
am.Count-1)\n lstPntParVal.Add(-1)\nend\n\nlstShpTypes = {}\nlstShpPoints = {}\nlstShpParam = {}\nlstAllNP = {}\nlstAllPnt = {}\n\nfObjType = false 'Установлен когда считан тип текущего объекта\nfHavePntPar = false 'Установлен когда считан хоть один параметр точки\nfMakePoint = false 'Установлен когда предпологается что считаны все параметры точки (пункта)\nfMakeShape = false 'Установлен когда предпологается что считаны все параметры объекта\nfMustbeDelim = true 'Установлен когда необходимо проверить наличие корректного
разделителя\n\n'// Основной цикл анализатора\nav.ShowStopButton\nwhile (_nCurLine < _LineCount)\n _Func.Get(\"Invent.GetToken\").Doit(1)\n if (_nTokenType = 2) then\n nPar = _nToken\n \n 'Если считанный параметр уже имеется в lstPntParVal, значит он принадлежит новой точке\n if (lstPntParVal.Get(nPar) = -1) then\n 'Проверяем присутствие знака '='\n _Func.Get(\"Invent.GetToken\").Doit(1)\n if (_nTokenType <> 4) then\n _Func.Get(\"Invent.Error\").Doit({4, _strToken})\n end\n \n 'С
читываем значение параметра\n _Func.Get(\"Invent.GetToken\").Doit(1)\n \n 'Анализируем полученное значение параметра\n if (_nTokenType = -1) then\n lstPntParVal.Set(nPar, _strToken)\n \n elseif (_nTokenType = 5) then\n if (_nToken = 1) then\n _Func.Get(\"Invent.Error\").Doit({1, \"\"})\n else\n lstPntParVal.Set(nPar, _strToken)\n end\n \n elseif (_nTokenType = 3) then\n lstPntParVal.Set(nPar, \"0\")\n \n 'Сбрасываем флаг н
еобходимости проверки разделителя\n fMustbeDelim = false\n \n elseif (_nTokenType = 0) then\n 'Вернуть лексему во входной поток\n _nCurPos = _nCurPos - _strToken.Count\n \n lstPntParVal.Set(nPar, \"0\")\n \n 'Сбрасываем флаг необходимости проверки разделителя\n fMustbeDelim = false\n \n elseif (((_nTokenType >= 1) and (_nTokenType <= 2)) or (_nTokenType = 6)) then\n _Func.Get(\"Invent.Error\").Doit({6, _strToken})\n \n elseif (_
nTokenType = 4) then\n _Func.Get(\"Invent.Error\").Doit({5, \"\"})\n \n elseif (_nTokenType = 10) then\n lstPntParVal.Set(nPar, \"0\")\n \n 'Сбрасываем флаг необходимости проверки разделителя\n fMustbeDelim = false\n \n end\n \n 'Устанавливаем флаг указывающий что считан параметр точки\n fHavePntPar = true\n \n else\n 'Устанавливаем флаг разрешающий создание точки\n fMakePoint = true\n \n 'Вернуть лексему во входной поток\n _n
CurPos = _nCurPos - _strToken.Count\n \n 'Сбрасываем флаг необходимости проверки разделителя\n fMustbeDelim = false\n \n end\n