Coloration sémantique

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Coloration sémantique

#1

Message par mdanielm »

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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Coloration sémantique

#2

Message par mikell »

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

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 )
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Coloration sémantique

#3

Message par mdanielm »

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)
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Coloration sémantique

#4

Message par mdanielm »

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]
Répondre