32 votes

(Est-il déjà légal en C # ou VB.Net?

La séquence .( jamais apparaître en code C # ou VB.Net?
(Pas dans une chaîne, un commentaire ou un littéral XML, EDIT : ou une directive de préprocesseur)

Je suis raisonnablement certain que la réponse est non, mais je voudrais m'en assurer.

22voto

Jason Points 125291

Les seuls endroits où . apparaissent dans la grammaire sont:

 real-literal:
    decimal-digits   .   decimal-digits ...
    .   decimal-digits ...

namespace-or-type-name:
    namespace-or-type-name   .   identifier ...


member-access:
    primary-expression   .   identifier ...
    predefined-type   .   identifier ...

qualified-alias-member   .   identifier ...

base-access:
    base   .   identifier

unbound-type-name:
    unbound-type-name   .   identifier

qualified-identifier: 
    qualified-identifier   .   identifier

member-name:
    interface-type   .   identifier

indexer-declarator:
    type   interface-type   .   this   
 

(Le ... signifie que j'ai élidé le reste de la règle de production.) Dans aucun de ces cas, un .( n'est valide car . est soit suivi de chiffres, d'un identifiant valide, ou le mot clé this .

20voto

Gabe Points 49718

En C#, un #region segment permet à tous les caractères de la suivre:

#region foo.(
// this is perfectly legal C#
#endregion

Notez que dans VB.Net ce n'est pas un problème parce que la région de l'étiquette doit être un littéral de chaîne, donc il y a des guillemets:

#Region "foo.("
' quotes required
#End Region

C'est aussi juridique après l' #error et #warn qui n'ont pas de VB équivalent.

La plus grande préoccupation, cependant, est que vous pouvez avoir n'importe quel code à l'intérieur d'un #if bloc. En C#:

#if false
    foo.( perfectly legal
#endif

Dans VB.Net:

#If False Then
    foo.( perfectly legal
#End If

C'est en fait pire que ça, parce que la version de visual basic permet arbitraire expressions de sorte que vous ne pouvez pas savoir si un code est en fait de VB à moins que vous évaluez les expressions. En d'autres termes, l'analyse seule ne suffit pas-vous avez à évaluer trop.

Cela dit, l'analyse de la grammaire dans la Spécification du Langage C# 4.0, Annexe B, . ce caractère apparaît dans les lignes suivantes:

réel littérale:
 décimal chiffres . virgule-les chiffres de l'exposant-partopt réel de type suffixopt
 . virgule-les chiffres de l'exposant-partopt réel de type suffixopt

opérateur-ou-punctuator: l'un des
 { } [ ] ( ) . , : ;

l'espace de noms ou de type-nom:
 l'espace de noms ou de type-nom . identificateur de type de l'argument-listopt

membre d'accès:
 primary-expression . identificateur de type de l'argument-listopt
 prédéfinis de type . identificateur de type de l'argument-listopt
 qualifié-alias-membre . identificateur de

de base-accès:
 de la base . identificateur de

indépendant de type-nom:
 indépendant de type-nom . identificateur générique-dimension-specifieropt

qualifiée de l'identificateur:
 qualifiée de l'identificateur . identificateur de

membre-nom:
 interface-type . identificateur de

indexeur-demande de déclaration:
 type d'interface-type . cette [ officiel-paramètres-liste ]

Depuis un . est toujours suivi d'un chiffre décimal, un identifiant ou un this jeton, la seule façon d'avoir un .( de la séquence est de permettre à plusieurs operator-or-punctuator symboles les uns à côté des autres. Regardant operator-or-punctuator,, nous voyons:

token:
 opérateur-ou-punctuator

Depuis token n'est utilisé que dans l'analyse lexicale, il n'y a rien à suggérer que l' . juridique est suivie par un ( régulièrement de code.

Bien sûr, il reste des commentaires, des littéraux, etc. que je laisse sortir, parce que vous savez déjà à propos de ceux-ci.

10voto

Ani Points 59747

Aucune référence à la grammaire et totalement non-scientifique, mais voici ce que je suppose:

.( n'est pas légal en C# (ne peux pas parler pour VB.NET).

En dehors des commentaires et des littéraux de chaîne, je pense que . , ne peut apparaître que:

  1. L'accès des membres de l'opérateur, qui doit être suivi par un identificateur. Depuis les identificateurs ne peut pas commencer par (, c'est un no go.
  2. Du point décimal dans la vraie littéraux, qui doit être suivi par un chiffre. ( n'est pas un chiffre.

Enfin, l' . opérateur n'est pas overloadable, alors foo.(bar) ne fonctionne pas, soit.

6voto

Konrad Rudolph Points 231505

Ayant lu le VB référence, je suis maintenant convaincu que la réponse à la VB est pas.

VB utilise le caractère . , pour seulement trois choses: à l'intérieur de nombre à virgule flottante littéraux et pour l'accès des membres et imbriquées nom d'accès.

En laissant de côté les littéraux XML, la seule chose qui peut chaque apparaître derrière l'accès d'un membre est une IdentifierOrKeyword (§1.105.6). Les identificateurs sont très bien définis et qu'ils ne pourront démarrer qu'avec des lettres, des traits de soulignement ou, dans le cas d'une fuite de l'identificateur, le caractère [.

Il en va de même pour les sous nom d'accès (et, à des fins d'exhaustivité, également en With blocs et champ initialisers).

Comme pour virgule flottante littéraux, le point, il doit être suivi par au moins un chiffre de plus (§1.6.3).

4voto

Sur cette page http://blogs.msdn.com/b/lucian/archive/2010/04/19/grammar.aspx j'ai mis une copie complète de la grammaire pour C#4 et VB10 en format lisible en machine (EBNF & ANTLR) et lisible (HTML). La version HTML inclut le calculées "peut-suit" définir pour chaque jeton.

Selon cette dernière, le "peut-suit" l'ensemble de la PÉRIODE ne comprend pas LPAREN en C#4 ou VB10.

Malheureusement, les grammaires ne sont pas tout à fait complète. Néanmoins, au sein de la VB/C# équipes, ces grammaires sont ce que nous commençons avec pour beaucoup de notre analyse. Par exemple...

  • VB10 introduit "une seule ligne d'instruction lambdas" de la forme "Sub() STMT". Un lambda en lui-même est une expression, et peut apparaître dans une liste par exemple "Dim tableau = {Sub() STMT1, Sub() STMT2}". Nous avons eu d'être conscient de l'ambiguïté au sujet de ce qui est arrivé après une expression et ce qui est venu après une déclaration. Par exemple, "Dim x = Sub() Dim y = 5, z = 3" est ambigu, car le "z=3" peut-être partie de la première OU de la deuxième Dim.

  • VB10 introduit "continuation de ligne implicite", qui est plus ou moins analogue permettant à C# pour inclure le point-VIRGULE n'importe où dans le code source. Nous avons dû comprendre si cette apportera toutes les ambiguïtés. C'est l'équivalent de demander si un préfixe d'une phrase dans la langue est également lui-même un jugement définitif. C'est l'équivalent de déterminer si l'intersection de deux contextes langues est vide. C'est un problème indécidable en général, mais pas dans le cas de la VB grammaire, de qui nous avons été en mesure de décider avec d'autres "compréhension de l'homme" dans l'algorithme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X