2011-07-05 2 views
2

Hé les gars, je travaille avec un langage de script personnalisé et je fais une sorte d'IDE pour ce langage en C#. Dans cette langue les fonctions sont définies comme suit:Meilleur moyen de trouver des fonctions avec regex?

yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

J'ai essayé de trouver la meilleure façon d'obtenir une liste de toutes les fonctions via regex et ne pouvait pas trouver un moyen de travailler pour obtenir une liste de toutes les fonctions définies. Quelqu'un pourrait-il me parler d'un meilleur moyen ou d'un moyen de le faire avec regex? Merci beaucoup!

EDIT: Quelque chose comme ça fonctionnerait en C#? %[a-z_0-9^[^]*]++ [a-z_0-9*^[^]]+[ ^t]++[a-z_0-9*^[^]]+[ ^t]++^([*a-z_0-9]+^)[ ^t]++([^p*&, ^t^[^]a-z_0-9./(!]++)[~;]

+0

duplication possible de [Les expressions régulières peuvent-elles être utilisées pour faire correspondre des modèles imbriqués?] (Http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns) – jtbandes

+1

Si vous êtes sérieux au sujet de votre langue, vous devriez utiliser une paire lexer/parser, pas regex. –

+0

Je peux le faire, merci pour la suggestion. – user556396

Répondre

4

Si vous voulez juste une liste de noms de fonction quelque chose comme cela pourrait fonctionner:

Regex.Matches(source,@"([a-zA-Z0-9]*)\s*\([^()]*\)\s*{").Cast<Match>() 
    .Select (m => m.Groups[1].Captures[0].Value).ToArray() 

Fondamentalement, ce regex est à la recherche de tout groupe de caractères alphanumériques, suivi d'un espace blanc en option, suivi d'une parenthèse ouverte, suivi par zéro ou plusieurs non-parenthèses, suivi d'une parenthèse fermante, suivie d'un espace blanc facultatif, puis d'une accolade ouverte. Ensuite, à partir de là, vous extrayez uniquement la partie initiale et créez une liste. En supposant que la langue n'autorise pas une parenthèse fermée à être suivie par une parenthèse bouclée ouverte, alors ce qui précède devrait fonctionner. Sinon, plus de détails seraient nécessaires.

+0

Je devrais noter que ce qui précède peut attraper des fonctions commentées, et attraper tout ce qui ressemble à une définition de fonction dans une chaîne. La meilleure façon de faire est d'avoir un analyseur. Ils ne sont pas vraiment difficiles à faire, surtout s'il existe une documentation formelle de la langue en question. Si la spécification comprend une grammaire en BNF ou quelque chose de similaire, le travail devient une traduction assez simple. –

0

Ce serait beaucoup plus facile si vous avez changé votre syntaxe en ajoutant un mot-clé réservé comme « def », de sorte que vos déclarations deviennent:

def yourfunctionhere(possiblepararmhere) 
{ 
    yourcodehere; 
} 

Ensuite, vous pouvez utiliser un simple regex comme def [a-zA-Z0-9]+.

+0

Moi aussi je pensais ça. C'est la raison pour laquelle je passais un moment si difficile. Malheureusement, je n'ai pas la possibilité de changer le langage de script. – user556396

+0

Aussi cette regex simple ne fonctionnerait pas (pensez à "def ..." dans un littéral de chaîne). Le livre du dragon (http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools) est vraiment l'autorité sur ce sujet. – Hut8

Questions connexes