是.(在C#或VB.Net中合法吗?

SLa*_*aks 32 c# vb.net syntax

序列可以.(出现在C#或VB.Net代码中吗?
(不是字符串,注释或XML文字,EDIT:或预处理器指令)

我有理由肯定答案是否定的,但我想确定一下.

jas*_*son 22

.语法中出现的唯一地方是:

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   
Run Code Online (Sandbox Code Playgroud)

(...意味着我已经省略了生产规则的其余部分.)在这些情况中,没有一个是.(有效的,因为.数字,有效标识符或关键字后面都是有效的this.


Gab*_*abe 20

在C#中,一个#region段允许任何字符跟随它:

#region foo.(
// this is perfectly legal C#
#endregion
Run Code Online (Sandbox Code Playgroud)

请注意,在VB.Net中这不是问题,因为区域标签必须是有效的字符串文字,因此它有引号:

#Region "foo.("
' quotes required
#End Region
Run Code Online (Sandbox Code Playgroud)

这也是法律后#error#warn其没有VB等同.

但是,最大的担忧是你可以在一个#if块中包含任意代码.在C#中:

#if false
    foo.( perfectly legal
#endif
Run Code Online (Sandbox Code Playgroud)

在VB.Net中:

#If False Then
    foo.( perfectly legal
#End If
Run Code Online (Sandbox Code Playgroud)

它实际上比这更糟糕,因为VB版本允许任意表达式,因此除非您评估表达式,否则您无法知道某些代码是否实际上是VB.换句话说,单独解析是不够的 - 你也必须进行评估.

也就是说,在C#语言规范版本4.0附录B中分析语法,该.字符显示在以下行中:

real-literal:
    decimal-digits   .   decimal-digits   exponent-partopt   real-type-suffixopt
    .   decimal-digits   exponent-partopt   real-type-suffixopt

operator-or-punctuator:  one of
    {     }     [     ]     (     )     .     ,     :     ;

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

member-access:
    primary-expression   .   identifier  type-argument-listopt
    predefined-type   .   identifier  type-argument-listopt
    qualified-alias-member   .   identifier

base-access:
    base   .   identifier

unbound-type-name:
    unbound-type-name   .   identifier   generic-dimension-specifieropt

qualified-identifier:
    qualified-identifier   .   identifier

member-name:
    interface-type   .   identifier

indexer-declarator:
    type   interface-type   .   this   [   formal-parameter-list   ]

由于a .始终后跟十进制数字,标识符或this标记,因此获得.(序列的唯一方法是允许多个operator-or-punctuator符号彼此相邻.抬头operator-or-punctuator看,我们看到:

token:
    operator-or-punctuator

由于token仅用于词法分析,因此没有任何迹象表明a .是合法的,后面是(常规代码.

当然,这仍然留下了我遗漏的评论,文字等等,因为你已经知道了这些.

  • +1,但那不是我真正想要的; 它本质上是一个评论.我要编辑问题以排除这一点,但它仍然是一个很好的答案. (3认同)

Ani*_*Ani 10

没有参考语法,完全不科学,但这是我的猜测:

.( 在C#中不合法(不能代表VB.NET).

在评论和字符串文字之外,我认为 .只能显示为:

  1. 成员访问运算符,后面必须跟一个标识符.由于标识符可能不是以标记开头(,因此不行.
  2. 作为实数文字中的小数点,必须后跟数字.(不是数字.

最后,.操作员不会过载,因此foo.(bar)也不起作用.

  • @Joel:据我所知,`5.`不是一个有效的文字. (3认同)

Kon*_*lph 6

仔细阅读VB参考资料后,我现在确信VB的答案是否定的.

VB .仅使用三个字符:浮点数字内部,成员访问和嵌套名称访问.

除了XML文字之外,唯一可能出现在成员访问之后的是IdentifierOrKeyword(§1.105.6).标识符定义非常明确,它们可能只以字母,下划线开头,或者在转义标识符的情况下,字符开头[.

嵌套名称访问也是如此(并且,为了完整性,也在With块和字段初始化器中).

至于浮点文字,必须至少再跟上一个数字(§1.6.3).


小智 5

在此页面http://blogs.msdn.com/b/lucian/archive/2010/04/19/grammar.aspx上,我以机器可读格式(EBNF 和ANTLR)和人类可读的(HTML)。HTML 版本包括为每个标记计算的“可能遵循”集。

据此,PERIOD 的“may-follows”集合在 C#4 或 VB10 中都不包括 LPAREN。

不幸的是,语法并不完全完整。然而,在 VB/C# 团队中,我们从这些语法开始进行大量分析。例如...

  • VB10 引入了“Sub() STMT”形式的“单行语句 lambda”。lambda 本身是一个表达式,并且可以出现在列表中,例如“Dim array = {Sub() STMT1, Sub() STMT2}”。我们必须意识到表达式之后的内容和陈述之后的内容的歧义。例如,“Dim x = Sub() Dim y = 5, z = 3”是不明确的,因为“z=3”可能是第一个或第二个 Dim 的一部分。

  • VB10 引入了“隐式行继续”功能,这或多或少类似于允许 C# 在源代码中的任何位置包含分号。我们必须弄清楚这是否会带来任何歧义。这相当于询问该语言中任何句子的前缀本身是否也是一个有效的句子。这相当于弄清楚两种上下文无关语言的交集是否为空。一般来说,这是一个无法判定的问题,但对于 VB 语法来说则不然,我们可以通过对算法的额外“人类洞察力”来决定。