2013-04-11 2 views
1

Je suis en train d'écrire une spécification de langage, et j'ai besoin de résoudre la question rudimentaire suivante. Supposons que je le (certes artificiel) syntaxe abstraite:Comment désigner la sémantique de cette syntaxe?

<A> ::= <B> | <C> 
<B> ::= 1 | 2 | 3 
<C> ::= 4 | 5 | 6 

Qu'est-ce que la sémantique dénotationnelle pour ce regard de la langue comme? Les non-terminaux sont inclus dans '<' et '>' et les terminaux ne le sont pas. Je souhaite mapper 1 ... 6 au domaine des nombres naturels. Ce qui ne me paraît pas du tout clair, c'est si je dois fournir des mappages pour les terminaux autres que les terminaux. Il semble que je ne devrais pas en avoir besoin puisque, par exemple, <A> ::= <B> | <C> n'a aucune signification; c'est simplement un peu de structure. Ignorer, pour le moment que nous pourrait éliminer cette règle entièrement.

Ainsi, tel qu'il est, ce que je pense que la définition dénotation complète devrait ressembler, où le côté droit (en italique) représente la valeur correspondante des nombres naturels:

[[1]] =un

[[2]] =deux

[[3]] =trois

[[4]] =quatre

[[5]] =cinq

[[6]] =six

Esthétiquement, il ne semble pas étrange de parler A, B ou C du tout, mais je suppose que ces symboles n'apparaîtra jamais dans un programme réel (comme: 4), alors peut-être que cela suffit. Tous les documents que j'ai sur ce sujet omettent cet aspect très simple du processus de définition de la langue dans leurs discussions.

Répondre

2

La sémantique est appliquée au programme généré par la grammaire. Lorsque vous générez un programme à partir de cette grammaire, vous ne verrez pas de non-terminaux, vous n'avez donc pas besoin de définir de sémantique pour eux.

Tenir compte par exemple:

Exp ::= Num | Exp + Exp 
Num ::= 0,1,2,... 

Dans cet exemple, il est nécessaire de définir la sémantique de toute Num au cas par cas, mais il est également important de définir la sémantique pour Exp, parce que l'une des productions, même si ce n'est pas terminal (mais il a une certaine notion de terminalité - + ne va pas changer) a une signification particulière qui lui est assignée - addition.

Donc, vous procédez comme suit:

[[0]] = 0 // first 0 is just some string, the second is a number from N 
[[1]] = 1 ... 
[[Exp + Exp]] = [[Exp]] + [[Exp]] // first + sign is just string, 
            // the second is addtion in N 

Comme vous pouvez le voir, lorsque vous définissez la sémantique vous efforcez de donner un sens à tous les programmes possibles qui peuvent être générés par votre grammaire.

Vous pouvez le penser de la manière suivante: lorsque votre production peut être appliquée récursivement, vous devez définir la sémantique - c'est le cas pour Exp + Exp. Num, cependant, conduit directement au terminal, peu importe ce que vous essayez de faire.

Sidenote: Il convient de mentionner pourquoi on nous donne une grammaire pour définir la sémantique.

Les grammaires sont les définitions les plus utiles du langage pour définir la sémantique. C'est parce que la sémantique peut être facilement définie en utilisant l'induction sur la structure de notre langage. Nous fournissons des règles pour les cas de base - terminaux, et la production non triviale, comme + dans notre exemple.

Questions connexes