Bonjour à tous
Vous connaissez la coloration syntaxique, voilà maintenant la coloration sémantique.
Exemple avec '-':
Le caractère '-' utilisé dans une expression algébrique, peut avoir plusieurs significations:
1- Le '-' peut désigner un opérateur binaire:
[codeautoit]$x = 3 - 2
$x = 3 - $x[/codeautoit]
Dans une coloration syntaxique, il est coloré avec une couleur spéciale aux opérateurs.
2- Le '-' peut désigner un opérateur unaire:
[codeautoit]$x = - $x
$x = - ($x - 1) ; unaire puis binaire
$x = - 1 ^ 2 ; unaire car -1²=-1 et pas +1 comme dit AutoIt
$x = -+2 ; le nombre est +2 et le - l'opérateur de changement de signe[/codeautoit]
et là encore il est coloré comme les opérateurs binaires, c'est acceptable.
3- Le '-' peut désigner le signe d'un nombre négatif:
[codeautoit]$x = -1
$x = -2.1e3 ; ou -2.e3 ou -.2e3
$x = - 0x1A
$x = +-2 ; le nombre est -2 et le + l'opérateur identité[/codeautoit]
et là je ne suis plus d'accord pour le colorer comme un opérateur, d'une couleur différente de celle des chiffres. Le nombre 'porte en lui' son signe qui fait partie de sa représentation. Celui qui y voit un opérateur de changement de signe, nie l'existence des nombres négatifs.
4- Le '-' a un sens particulier quand il est précédé de 'e' ou 'E'
[codeautoit]$x = 2e-3[/codeautoit]
C'est l'écriture scientifique d'un seul nombre, le '-' fait partie de la convention d'écriture: 2e-3 veut dire 2*10^-3.
C'est absurde de colorer le '-' de la couleur des opérateurs.
L'idée consiste à colorer le '-' des cas 1 et 2 de la même couleur que les opérateurs et le '-' des cas 3 et 4 de la même couleur que les chiffres du nombre.
Question:
Dans du code AutoIt, supposé correct d'un point de vue syntaxique, quelle est la regex qui matche les nombres avec leur signe?
...et que pensez-vous de l'idée?
Cdlt
Coloration sémantique
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
- mikell
- Spammer !
- Messages : 6292
- Enregistré le : dim. 29 mai 2011 17:32
- Localisation : Deep Cévennes
- Status : Hors ligne
Re: Coloration sémantique
Une regex matche des strings, le "-" y est reconnu comme un caractère indépendant. Si on l'inclut dans le pattern ça ne fait pas la différence avec le "-" opérateur
Faudrait chercher ailleurs
Faudrait chercher ailleurs
Code : Tout sélectionner
$n = -2
Msgbox(0,"", StringRegExp($n, '^\d$') ) ; marche pas
Msgbox(0,"", StringRegExp($n, '^-?\d$') ) ; matche aussi l'opérateur
Msgbox(0,"", IsNumber($n) )
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Re: Coloration sémantique
Je pense qu'il faut chercher des instructions AutoIt dans lesquelles on peut trouver des nombres négatifs.
[codeautoit]$x = -1 ; ou - 1 (avec espace) ou -1.e-1 ou -.1e2 ou n'importe quelle syntaxe admise par AutoIt
Local $x[] = [ - 1, - 2]
$x = Abs( -1. ) ; ou n'importe quelle autre fonction d'une ou plusieurs variables: mod(-13,-2)
$x = 1e2 + -100 ; ou n'importe quel opérateur binaire: +-*/[/codeautoit]
.... et sans doute d'autres situations. Lesquelles?
Règle générale:
Le '-' est le signe d'une nombre négatif (et pas un opérateur), s'il est précédé (aux espaces près) d'un des caractères suivants:
'=', '[', ',', '(', '+', '-', '*', '/'
Exception à la règle:
[codeautoit]$x = -1^2[/codeautoit]
Règle: Si un nombre précédé de - est suivi de ^, alors le nombre est positif et le - est unaire.
(Ce serait aussi le cas de factorielle '!' et carré '²', si le langage soutenait ces opérateurs: -3!=-6 et -3²=-9)
[codeautoit]$x = -1 ; ou - 1 (avec espace) ou -1.e-1 ou -.1e2 ou n'importe quelle syntaxe admise par AutoIt
Local $x[] = [ - 1, - 2]
$x = Abs( -1. ) ; ou n'importe quelle autre fonction d'une ou plusieurs variables: mod(-13,-2)
$x = 1e2 + -100 ; ou n'importe quel opérateur binaire: +-*/[/codeautoit]
.... et sans doute d'autres situations. Lesquelles?
Règle générale:
Le '-' est le signe d'une nombre négatif (et pas un opérateur), s'il est précédé (aux espaces près) d'un des caractères suivants:
'=', '[', ',', '(', '+', '-', '*', '/'
Exception à la règle:
[codeautoit]$x = -1^2[/codeautoit]
Règle: Si un nombre précédé de - est suivi de ^, alors le nombre est positif et le - est unaire.
(Ce serait aussi le cas de factorielle '!' et carré '²', si le langage soutenait ces opérateurs: -3!=-6 et -3²=-9)
Re: Coloration sémantique
Et voilà les regex qui semblent convenir, non?
[codeautoit]Global $regex1, $regex2
BuilRegEx()
ConsoleWrite("$regex1=" & $regex1 & @crlf & "$regex2=" & $regex2 & @crlf)
func BuildRegEx()
; Inclus le signe qui précède le nombre
; Integer
Local $intUnsigned = '\d+'
Local $int = '[-+]?\s*' & $intUnsigned ; 12 + 12 - 12
Local $intWithoutSpace = '[-+]?' & $intUnsigned ; pour notation scientifique
; Float (inclus les integer: Z inclus dans D)
Local $floatUnsigned = '(?:\d+\.\d*|\d*\.\d+|' & $intUnsigned & ')'
Local $float = '[-+]?\s*' & $floatUnsigned ; + 12. 12.3 - .12
; Notation scientifique: pas d'espace à gauche et à droite de e ni entre le signe et les chiffres de l'exposant
; Incorrect: +2 e3 2e 3 2e- 3 2e -3
Local $scientUnsigned = $floatUnsigned & "[eE]" & $intWithoutSpace
Local $scient = $float & "[eE]" & $intWithoutSpace
; hexa
Local $hexaUnsigned = '0x[A-Fa-f\d]+'
Local $hexa = '[-+]?\s*' & $hexaUnsigned
; nombre AutoIt
Local $numberUnsigned = $hexaUnsigned & '|' & $scientUnsigned & '|' & $floatUnsigned
Local $number = $hexa & '|' & $scient & '|' & $float
; D'abord le - unaire devant une puissance prioritaire -1^2
$regex1 = '(-)(\s*)(' & $numberUnsigned & ')(\s*\^)'
; Nombre au3 quelconque AVEC son signe
Local $regex2 = _
'([=[,*/+\-\^(]\s*)' & _ ; caractères qui annoncent un nombre éventuellement négatif
'(' & $number & ')'
EndFunc[/codeautoit]
[codeautoit]Global $regex1, $regex2
BuilRegEx()
ConsoleWrite("$regex1=" & $regex1 & @crlf & "$regex2=" & $regex2 & @crlf)
func BuildRegEx()
; Inclus le signe qui précède le nombre
; Integer
Local $intUnsigned = '\d+'
Local $int = '[-+]?\s*' & $intUnsigned ; 12 + 12 - 12
Local $intWithoutSpace = '[-+]?' & $intUnsigned ; pour notation scientifique
; Float (inclus les integer: Z inclus dans D)
Local $floatUnsigned = '(?:\d+\.\d*|\d*\.\d+|' & $intUnsigned & ')'
Local $float = '[-+]?\s*' & $floatUnsigned ; + 12. 12.3 - .12
; Notation scientifique: pas d'espace à gauche et à droite de e ni entre le signe et les chiffres de l'exposant
; Incorrect: +2 e3 2e 3 2e- 3 2e -3
Local $scientUnsigned = $floatUnsigned & "[eE]" & $intWithoutSpace
Local $scient = $float & "[eE]" & $intWithoutSpace
; hexa
Local $hexaUnsigned = '0x[A-Fa-f\d]+'
Local $hexa = '[-+]?\s*' & $hexaUnsigned
; nombre AutoIt
Local $numberUnsigned = $hexaUnsigned & '|' & $scientUnsigned & '|' & $floatUnsigned
Local $number = $hexa & '|' & $scient & '|' & $float
; D'abord le - unaire devant une puissance prioritaire -1^2
$regex1 = '(-)(\s*)(' & $numberUnsigned & ')(\s*\^)'
; Nombre au3 quelconque AVEC son signe
Local $regex2 = _
'([=[,*/+\-\^(]\s*)' & _ ; caractères qui annoncent un nombre éventuellement négatif
'(' & $number & ')'
EndFunc[/codeautoit]