2009-07-06 8 views
9

J'écris un analyseur pour analyser CSS.Comment tester un analyseur CSS?

J'ai commencé par modifier le CSS reference grammar, pour utiliser la grammaire et la syntaxe lexer supportées par le 3rd-party parser generator tool que j'utilise.

Je pense que j'ai fini de coder la grammaire: le parseur-générateur est maintenant capable de générer des tables de transition d'état pour/de ma grammaire. Le résultat (la sortie du parseur-générateur) est d'environ 116 "règles", ce qui correspond à 116 cas dans une instruction switch. Des exemples de ces règles/instructions switch sont:

  1. Stylesheet commence par la spécification d'un charset
  2. Stylesheet commence sans spécifier charset:
  3. Stylesheet est vide
  4. Stylesheet commence par des espaces
  5. ... etc

Le parseur-générateur a fait tout ce qu'il peut pour moi, et maintenant je commence à écrire (à la main) les différents cas des déclarations switch, qui vont construire ce que je pense que les gens appellent un «arbre de syntaxe abstraite».

Ma question est sur la façon de tester cela. Je pense que ce que je veux, c'est un ensemble de fichiers CSS qui exercent les diverses combinaisons et possibilités: par ex. un fichier CSS qui spécifie un jeu de caractères; un autre fichier qui ne spécifie pas de charset; etc.

  • Y at-il général un moyen de générer automatiquement cet ensemble de données d'entrée, pour une grammaire arbitraire ou un ensemble de règles?

  • Alternativement, y a-t-il un ensemble de spécifiquement CSS, dont le but est de couvrir la combinaison et les possibilités permises par la grammaire CSS standard?

N'hésitez pas à commenter aussi si je vais à ce sujet tout faux.

En ce moment je ne ai pas besoin:

  • fichiers pour tester le traitement des illégales entrée (ie des fichiers qui ne sont pas conformes à la grammaire)

  • Test de la façon dont différents navigateurs rendent basé sur leur analyse syntaxique de CSS

Répondre

4

Microsoft a réalisé un ensemble de plusieurs milliers de tests CSS pour la conformité IE8 aux spécifications CSS. http://samples.msdn.microsoft.com/ietestcenter/css.htm

Bien qu'ils se concentrent sur les tests de conformité du navigateur, vous pouvez éventuellement les adapter.

Il y a aussi les suites de tests anciens du W3C, qui ne sont pas aussi complètes, mais pourrait servir votre but: http://www.w3.org/Style/CSS/Test/

+0

Le lien microsoft est mort – Dannnno

2

Un contexte grammaire libre propose implicitement un ensemble infini de (parse) arbres. Chaque arbre proposé a un ensemble de feuilles qui font une phrase concrète dans la langue acceptée par cette grammaire. En explorant l'ensemble des arbres proposés (par exemple, en développant chaque non-terminal en fonction des alternatives possibles), vous pouvez générer n'importe quelle instance arbitraire du langage. Vous pouvez générer un ensemble de tests en parcourant les propositions d'arbres et en faisant des choix aléatoires. Une approche plus ciblée consisterait à utiliser la recherche d'approfondissement itérative pour générer des phrases classées par taille. Avec n'importe quel grammaire intéressant, vous êtes susceptible d'obtenir un grand nombre d'instances, mais bon, c'est ce que les tests automatisés sont pour. Ce que je ne ferais pas est de générer de telles phrases à partir de votre grammaire de production, parce que les phrases que vous générez seront, par définition, celles qu'il accepte: - {Ce que vous devez faire est de construire votre générateur de phrases à l'aide de la référence grammaire, pour exploiter le fait que ce que vous acceptez et ce que vous avez implémenté pourrait être différent.

+0

Avec ma grammaire, j'ai environ 55 non-terminaux. Si je l'évalue en tant qu'analyseur top-down, la méthode associée au non-terminal de niveau supérieur appelle des méthodes associées à des non-terminaux de niveau inférieur, et ainsi de suite. Chaque méthode non-terminale appelle environ 1 à 3 méthodes de niveau inférieur (via une instruction 'switch' dans la méthode) et est invoquée par 1 ou parfois 2 méthodes de niveau supérieur différentes. Il serait même utile d'avoir une couverture complète du code: pour s'assurer que toutes les possibilités sont testées au moins une fois (sans espérer toutes les combinaisons de toutes les possibilités), ... – ChrisW

+0

... qui pourrait prendre de l'ordre de (55 x 3 =) 150 cas de test. Je pense que je suis d'accord avec vous sur le fait qu'il y a peu à gagner à générer ces cas de test automatiquement à partir de la grammaire. J'ai demandé cependant parce que je n'ai jamais été formellement dit à propos de l'analyse à l'école, alors que d'autres personnes étaient: et je me demandais si on vous avait enseigné s'il y a un algorithme bien connu pour tester les parseurs. – ChrisW

+0

Personne ne m'a appris à tester un parseur, à l'école ou à l'extérieur. Juste pas dans le programme. Je construis beaucoup d'entre eux, mais je m'appuie surtout sur des zillions de cas de test en code réel, car la plupart des compilateurs ne correspondent pas à ce que les compilateurs ont réellement implémenté (voir Microsoft et C#). standard, et ne l'a pas implémenté!). Vous semblez avoir de la chance, en ayant un vrai grammer de référence. –