c# - C# 语言规范 4.0 中是否正确定义了基本访问权限?

标签 c# grammar language-lawyer

当我浏览 C# Language Specification v4.0 时,我注意到有一组规则定义如下:

invocationExpression:
    primaryExpression '(' argumentList? ')'

primary-expression: 
    primary-no-array-creation-expression
    array-creation-expression

primary-no-array-creation-expression:
    literal
    simple-name
    parenthesized-expression
    member-access
    invocation-expression
    element-access
    this-access
    base-access
    post-increment-expression
    post-decrement-expression
    object-creation-expression
    delegate-creation-expression
    anonymous-object-creation-expression
    typeof-expression
    checked-expression
    unchecked-expression 
    default-value-expression
    anonymous-method-expression

base-access:
    'base'   '.'   identifier
    'base'   '['   argument-list   ']'

当我试图匹配这个语句时(顺便说一下,这是正确的语句,我已经看到它在一个项目中使用过)

base.VisitList<T>(list, visitor);

根据给定的规则,我没有看到如何做到这一点。不应将 base-access 定义为:

 base-access:
        'base'   '.'   identifier type-parameter-list(opt)
        'base'   '['   argument-list   ']'

或者类似的语法能够捕获语句的方式?

编辑 我看到的例子是在db4o项目的C#版本中,是这样的(我删除了大部分声明,只留下重要的声明)

internal abstract class ExpressionVisitor
{
    protected virtual void VisitList<T>()
    {
    }
}

internal class HashCodeCalculation : ExpressionVisitor
{
    protected override void VisitList<T>()
    {
        base.VisitList<T>();
    }
}

最佳答案

确实看起来规范中可能存在错误。

解析表达式的方式

this.VisitList<T>(list, visitor)

如下:

invocation-expression

primary-expression '(' argumentList? ')'

primary-no-array-creation-expression '(' argumentList? ')'

member-access '(' argumentList? ')'

primary-expression '.' identifier type-argument-listopt '(' argumentList? ')'

this-access '.' identifier type-argument-listopt '(' argumentList? ')'

'this' '.' identifier type-argument-listopt '(' argumentList? ')'

等等。

换句话说,this-access被定义为

this-access:
    'this'

如果 base-access 定义为

base-access:
    'base'

然后是解析表达式的方式

base.VisitList<T>(list, visitor)

将如下所示:

invocation-expression

primary-expression '(' argumentList? ')'

primary-no-array-creation-expression '(' argumentList? ')'

member-access '(' argumentList? ')'

primary-expression '.' identifier type-argument-listopt '(' argumentList? ')'

base-access '.' identifier type-argument-listopt '(' argumentList? ')'

'base' '.' identifier type-argument-listopt '(' argumentList? ')'

等等。

但事实并非如此。

关于c# - C# 语言规范 4.0 中是否正确定义了基本访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19029373/

相关文章:

c# - Process.Start() 的替代方法

c# - x 轴上的自定义标签

c# - 为什么 NUnit 超时属性不起作用?

ruby - Treetop 语法中的匹配标签对

c++ - 在 C 和 C++ 中返回 void 类型

c - 表达式的右手边总是先求值

java - partitioningBy 必须生成包含 true 和 false 条目的映射吗?

c# - DataGrid - 新数据到达时重置网格选择

eclipse - XText:使用自定义终端定义

c++ - int a[] = {1,2,};为什么允许在初始化列表中使用尾随逗号?