Creat0R
Цитата:
Причины есть, такие как »
|
существенных вижу только две - "независимая схема раскраски" и "интерес"

про скорость еще рано говорить, про файлы тоже... "независимость" и вовсе штука относительная, особенно в мире программ
Цитата:
не вижу как список UDF может повлиять на процесс раскраски? Пока синтаксис не меняется, или не добавляются новые операторы
|
Синтаксис на раскраску как раз не влияет - и это гут... иначе проблем не оберешься... к примеру, в CMD раскрасить код на порядок сложнее (нормально, а не как в SciTE). В лексическом анализе без сверки со словарем обойтись проблематично - иначе не отделить функции от операторов, операторы от UDF и т.д. Тот же SciTE поддерживает полный список всех служебных слов - в том числе системных UDF, а эти списки сильно меняются от версии к версии.
Как вариант - восстановить список используемых UDF из самого скрипта. Это позволит строить схемы раскраски, используя:
- имя UDF (это просто);
- имя загружаемого файла, в котором определен UDF (обычно синхронен с именем UDF, хотя и не всегда);
- тип загружаемого файла (системный, пользовательский, другой)... имхо самая полезная фича.
Примеры UDF, с помощью которых можно это реализовать:
Код:

#include <array.au3>
Global $v[1]
_AU3_GetAllLibUDF (FileRead(@ScriptFullPath), $v)
For $i=1 To $v[0][0]
ConsoleWrite($v[$i][0] &":"& $v[$i][1] &@CRLF)
$a = $v[$i][2]
If IsArray($a) Then
For $j=0 To UBound($a)-1
ConsoleWrite(@TAB& $a[$j] &@CRLF)
Next
EndIf
Next
; ===============================================================
; _AU3_GetAllLibUDF($text, $var)
; ---------------------------------------------------------------
; Возвращает массив всех загруженных UDF и библиотечных файлов
; Использован AutoIT v3.2.12.0
;
; $text : текст AutoIT-скрипта
; $var : ссылка на переменную для выходного массива,
; по выходу содержит двумерный массив:
; $var[0][0] - количество элементов в массиве
; $var[$i][0] - тип библиотечного файла
; $var[$i][1] - имя библиотечного файла (без пути)
; $var[$i][2] - массив UDF, определенных в файле
;
; Функция рекурсивная, поэтому выход по ошибке не предусмотрен
; ===============================================================
Func _AU3_GetAllLibUDF($text, ByRef $var)
Local Const $rFile = '(?i)(?:^|[\n\r])[ \t]*#include[ \t]+((?:\<|")[^\n\r\"\>]+(?:\>|"))'
Local Const $rUDFs = '(?i)(?:^|[\n\r])[ \t]*Func[ \t]+([\w\d]+)'
; Инициализация массива при первом входе / сохранение списка UDF
If UBound($var,2)<>3 Then Dim $var[2][3] = [[1,0,0],[0,"",0]]
$var[$var[0][0]][2] = StringRegExp($text, $rUDFs, 3)
; Инициализация переменных / Получение списка библиотечных файлов
Local $sPath, $iType, $sName, $sText
Local $aFile=StringRegExp($text, $rFile, 3)
; Пофайловая обработка списка библиотек
If IsArray($aFile) Then
For $i=0 To UBound($aFile)-1
$sPath = _AU3_LibIncToPath($aFile[$i]) ; полное имя файла
If @error Then ContinueLoop ; файл не найден
$iType = @extended ; тип библиотеки
$sName = StringRegExpReplace($sPath, "(?:[^\\]+\\)+", "") ; краткое имя файла
; Исключение повторной обработки / Чтение файла
For $j=1 To $var[0][0]
If $var[$j][0]==$iType And $var[$j][1]==$sName Then ContinueLoop 2
Next
$sText = FileRead($sPath)
If @error Then ContinueLoop
; При успешном чтении добавляем файл в выходной массив
$var[0][0] +=1
ReDim $var[$var[0][0]+1][3]
$var[$var[0][0]][0] = $iType
$var[$var[0][0]][1] = $sName
; Рекурсивный вызов на обработку текста библиотеки
_AU3_GetAllLibUDF($sText, $var)
Next
EndIf
EndFunc ; ==> _AU3_GetAllLibUDF
; ===============================================================
; _AU3_LibIncToPath($sInclude)
; ---------------------------------------------------------------
; Возвращает полный путь к библиотечному файлу по строке агрузки
; Использован AutoIT v3.2.12.0
;
; $sInclude : строка загрузки в формате #include, примеры:
; '<array.au3>'
; '"array.au3"'
; '"c:\Program Files\AutoIT3\Include\array.au3"'
;
; При успехе : возвращает полное имя файла, содержащее путь,
; макрос @extended указывает на тип библиотеки:
; 1 - системная библиотека (каталог установки)
; 2 - текущая библиотека (каталог скрипта)
; 3 - пользовательская библиотека (путь из реестра)
; 4 - путь к библиотеке явно указан при загрузке
;
; При неудаче : возвращает пустую строку и устанавливает @error:
; 1 - ошибка формата строки
; 2 - файл не найден
; ===============================================================
Func _AU3_LibIncToPath($sInclude)
Local $aRegExp = StringRegExp($sInclude, '^(<|")([^>"]+)(?:>|")$', 3)
; Проверка на корректность формата строки
If Not(IsArray($aRegExp)) Then Return SetError(1, 0, "")
$sInclude = $aRegExp[1]
If StringInStr($sInclude, "\") =0 Then
Local $sSYS, $sUDL, $aUDL, $sAU3 = @ScriptDir &"\"& $sInclude
; Определение каталога системных библиотек
$sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
$sSYS &= "\Include\"& $sInclude
; Чтение списка каталогов пользовательских библиотек
$sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
$aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)
; Проверка типов 1 и 2 (до пользовательских библиотек)
If $aRegExp[0]=='<' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
ElseIf $aRegExp[0]=='"' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
EndIf
; Проверка типа 3 (поиск среди пользовательских библиотек)
If IsArray($aUDL) Then
For $i=0 To UBound($aUDL)-1
$aUDL[$i] &= "\"& $sInclude
If FileExists($aUDL[$i]) Then Return SetError(0,3,$aUDL[$i])
Next
EndIf
; Проверка типов 1 и 2 (после пользовательских библиотек)
If $aRegExp[0]=='<' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
ElseIf $aRegExp[0]=='"' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
EndIf
Else
; Проверка типа 4 (файл с указанием полного пути)
If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
EndIf
; ОШИБКА: файл не найден
Return SetError(2, 0, "")
EndFunc ; ==> _AU3_LibIncToPath