Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:38, 16-10-2008 | #1000