sve*_*sve 5 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 ']'
Run Code Online (Sandbox Code Playgroud)
当我试图匹配这个语句时(顺便说一下,这是正确的语句,我看到它在项目中使用过)
base.VisitList<T>(list, visitor);
Run Code Online (Sandbox Code Playgroud)
根据给定的规则,我没有看到如何做到这一点.不应该base-access定义为:
base-access:
'base' '.' identifier type-parameter-list(opt)
'base' '[' argument-list ']'
Run Code Online (Sandbox Code Playgroud)
或者类似的东西以这种方式语法能够捕获声明?
编辑我看到的例子是项目的C#版本,db4o它是这样的(我删除了大部分声明,只留下了重要的声明)
internal abstract class ExpressionVisitor
{
protected virtual void VisitList<T>()
{
}
}
internal class HashCodeCalculation : ExpressionVisitor
{
protected override void VisitList<T>()
{
base.VisitList<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
确实看起来规范中可能存在错误.
解析表达式的方法
this.VisitList<T>(list, visitor)
Run Code Online (Sandbox Code Playgroud)
如下:
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? ')'
Run Code Online (Sandbox Code Playgroud)
等等.
换句话说,this-access定义为
this-access:
'this'
Run Code Online (Sandbox Code Playgroud)
如果base-access被定义为,那将是很有意义的
base-access:
'base'
Run Code Online (Sandbox Code Playgroud)
然后是解析表达式的方法
base.VisitList<T>(list, visitor)
Run Code Online (Sandbox Code Playgroud)
如下:
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? ')'
Run Code Online (Sandbox Code Playgroud)
等等.
但事实并非如此.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |