2016-09-26 1 views
0

Bonne journée! J'essaie de créer un programme qui accepte une expression Lambda de l'utilisateur et ce que ce programme fait est de vérifier s'il s'agit d'une expression Lambda valide.Validation de l'expression en utilisant preg_match

exemple - entrées utilisateur (λa.abc) a -> valide alors

mon problème est que ma connaissance de la fonction Regex est très limitée, je me sers de preg_match pour résoudre cela, mais pas encore beaucoup d'un progrès. toute aide sera très apprécié .. Merci :)

Eh bien ce sont les règles d'un λ-expression valide

  1. une seule variable = (seule lettre)
  2. application de fonction
  3. = (de λ -expression) (λ-expression)
  4. abstraction de la fonction λ = (variable). (λ-expression)

Voici le code que je l'ai fait avec preg_match

if(preg_match("/\((L([a-z])*.(([a-z])*)*)\)/", $getexpression, $match)): 
print "Valid!"; 

ne fonctionne pas vraiment bien

+0

Veuillez publier d'autres exemples de ces expressions et comment elles sont valides/non valides. Ainsi que le code que vous avez vous-même produit jusqu'ici. – ChristianF

+0

vraiment désolé pour le formatage je suis un peu nouveau ici – Gorodetski

+0

S'il vous plaît modifier votre question, pour contenir toutes les informations d'une manière plus lisible. – ChristianF

Répondre

1

Je dois avouer que je n'ai pas trop de votre définition des expressions, puisque vous dites essentiellement « un expression est une variable ou une collection de variables ".
Je recommande généralement d'éviter d'utiliser le mot que vous essayez de définir dans la définition elle-même.

Cela dit, à la lecture sur Wikipédia et les commentaires, je pense que je pourrais avoir obtenu à ce qui pourrait être interprété comme une expression régulière de travail pour cela:

// Basic definition: Lambda + letter == variable. 
$lVar = 'λ[a-z]'; 

// Complex definition: Variable, possibly followed by variables, 
// and closed with a letter preceeded by a dot or whitespace. 
$lExp = "({$lVar}(?:\\.{$lVar})*(?:[ .][a-z]+))"; 

// Complete definition: 
// 1. Only single expression. 
// 2. Or a parameterized expression which may contain 
//  the entire pattern recursively. 
$lRegEx = "/^$lExp|\\($lExp(?R)\\)\\Z/u"; 

Cela étant dit, je ne suis pas 100% sûr que cela peut être testé avec une expression régulière. Au moins pas complètement. Cela semble être le genre de chose que vous devez écrire/utiliser un tokenizer pour.