Что нового

Добавление знака $ ко всем переменным в тексте

Vlasssov

Осваивающий
Сообщения
429
Репутация
25
При написании скриптов, если честно, частично задалбливает добавление знака $ перед началом переменных. Никто не думал над регулярным выражением, которое бы добавляло это знак к тексту вида

Код:
for i=1 to n
mas[i][1] = chr(i)
next


Ну и так далее... Потому что есть еще вот такие вот конструкции

Код:
func _myfunc(ByVal $mas, $i)
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Не советую это делать, так как большая вероятность внести ошибки в исходники.
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
429
Репутация
25
В какие исходники?
 

Fever

Скриптер
Сообщения
308
Репутация
112
Vlasssov [?]
В свои, конечно. Если честно, не вижу смысла в такой полезняшке. На деле же, как сказано во 2 посте, есть вероятность внесения ненужных ошибок в скрипт. Лучше уж потратить секунду своего драгоценного времени и поставить спец.символ, чем потом проверять n-нную строчку исходника на наличие ошибок.
 

Zaramot

I ♥ AutoIt
Сообщения
1 160
Репутация
659
OffTopic:
Мне интересно: как различить переменные от любого другого текста ? :scratch:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Zaramot [?]
Мне интересно: как различить переменные от любого другого текста ?
Только буквы и "_" & не ключевое слово & сразу после неё не стоит "(" & не в кавычках => переменная

Сложности возникнут в таких местах:
Код:
If True Then

Код:
While 1
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Это можно сделать если читать файл au3.keywords.properties (имена функций и операторов).
Как то так:

Код:
#include <Array.au3>

$sScript_File = @DesktopDir & "\Script.au3"
$sAu3_Keywords_File = @AutoItExe & "\..\SciTE\properties\au3.keywords.properties"

$aScript_Read = StringSplit(StringStripCR(FileRead($sScript_File)), @LF)

$sFuncs = _PropertiesRead($sAu3_Keywords_File, "au3.keywords.functions", "", 0)
$sUDFs = _PropertiesRead($sAu3_Keywords_File, "au3.keywords.udfs", "", 0)
$sKeywords = _PropertiesRead($sAu3_Keywords_File, "au3.keywords.keywords", "", 0)
$sMacros = _PropertiesRead($sAu3_Keywords_File, "au3.keywords.macros", "", 0)
$sPreprocessor = _PropertiesRead($sAu3_Keywords_File, "au3.keywords.preprocessor", "", 0)
$sSpecial = _PropertiesRead($sAu3_Keywords_File, "au3.keywords.special", "", 0)

$sAu3_Keywords = StringRegExpReplace(" " & $sFuncs & " " & $sUDFs & " " & $sKeywords & " " & $sMacros & " " & $sPreprocessor & " " & $sSpecial & " ", "[@#]", "")

For $i = 1 To $aScript_Read[0]
	$aWords = StringRegExp($aScript_Read[$i], "([a-zA-Z_]+)", 3)
	
	For $j = 0 To UBound($aWords)-1
		If Not StringInStr($sAu3_Keywords, " " & $aWords[$j] & " ", 2) Then
			$aScript_Read[$i] = StringRegExpReplace($aScript_Read[$i], "([^<_\$#@\.]\s*|^\s*)\Q" & $aWords[$j] & "\E", "\1\$" & $aWords[$j])
		EndIf
	Next
Next

;~ _ArrayDisplay($aScript_Read)

Dim $sScript_Read

For $i = 1 To $aScript_Read[0]
	$sScript_Read &= $aScript_Read[$i] & @CRLF
Next

FileOpen($sScript_File, 2)
FileWrite($sScript_File, $sScript_Read)
FileClose($sScript_File)

Func _PropertiesRead($sFile, $sProperty, $sDefault = "", $iRetArr = 1)
	Local $aFileRead = StringSplit(StringStripCR(FileRead($sFile)), @LF)
	Local $sRet, $sPattern = '(?i)^\s*\Q' & $sProperty & '\E\s*=\s*'
	
	For $i = 1 To $aFileRead[0]
		If StringRegExp($aFileRead[$i], $sPattern) Then
			$aFileRead[$i] = StringRegExpReplace($aFileRead[$i], $sPattern, '')
			
			If StringRight($aFileRead[$i], 1) = "\" Then
				$aFileRead[$i] = StringTrimRight($aFileRead[$i], 1)
			EndIf
			
			$sRet &= StringStripWS($aFileRead[$i], 3)
			
			For $j = $i+1 To $aFileRead[0]
				If StringInStr($aFileRead[$j], "=") Then
					ExitLoop 2
				Else ;If StringLeft(StringStripWS($aFileRead[$j], 1), 1) <> "#" Then
					If StringRight($aFileRead[$j], 1) = "\" Then
						$aFileRead[$j] = StringTrimRight($aFileRead[$j], 1)
					EndIf
					
					$sRet &= " " & StringStripWS($aFileRead[$j], 3)
				EndIf
			Next
			
			ExitLoop
		EndIf
	Next
	
	If $sRet == "" Then
		$sRet = $sDefault
	Else
		$sRet = StringStripWS($sRet, 3)
	EndIf
	
	If $iRetArr Then
		Return StringSplit($sRet, " 	")
	EndIf
	
	Return $sRet
EndFunc


Переменные с числами не обрабатываются, для этого нужно ещё помучать обработчик :smile:
 

Ganibal95

GreenBytes
Сообщения
876
Репутация
239
а что самомум лень ставить $ знак? :-\
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
429
Репутация
25
а что самомум лень ставить $ знак?
А еще круче текст сначала ручкой на бумажке писать, а потом только вбивать...
CreatoR - спасибо!
Только во не понял - а зачем функции читать?
Конструкции переменных идут либо перед знаками операторов (=,<,>,+,-,\), либо в скобках, при вызове функций, это когда
Код:
fff($a,$b)

то есть круглая скобка
Либо
Код:
While $a

Либо массив, это когда после символа стоит квадратная скобка.
Одно понятно - проще модуль написать, тут одними регулярными выражениями не отделаешься, хотя... :scratch:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Vlasssov [?]
А еще круче текст сначала ручкой на бумажке писать, а потом только вбивать...
А можно ещё всем переменным и функциям давать имена из одной или двух букв, так короче.
Ещё можно по русски говорить без предлогов, вместо "велосипед" писать "виласепед", пеермеишвать бкувы в словах.

В любом языке есть правила, которые имхо надо соблюдать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
429
Репутация
25
А можно ещё всем переменным и функциям давать имена из одной или двух букв, так короче.
Ещё можно по русски говорить без предлогов, вместо "велосипед" писать "виласепед", пеермеишвать бкувы в словах.
Кхе, кхе... Есть такая наука - эргономика. :ok:
Чтобы отличить переменную от имени функций, которая также может следовать за операторами
То есть конструкция языка предполагает, что возможно помещение идентификатора функции без скобок? То есть что-то типа
Код:
$a=myfunc+$b

А на зарезервированные слова проверят надо, это без вопросов.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Vlasssov [?]
То есть конструкция языка предполагает, что возможно помещение идентификатора функции без скобок?
Нет, я проверяю через StringInStr, так легче, поэтому нужно проверять все keywords.
 
Верх