为什么 Kind PreIncrement 的 PrefixUnaryExpressionSyntax 允许括号表达式语法的操作数?
Why does PrefixUnaryExpressionSyntax of Kind PreIncrement allow for Operands of ParanthesisedExpressionsSyntax's?
我正在尝试了解 C# 分析器和编译器的工作原理。
根据文档,像 pre-inc 和 post-inc 这样的一元运算符应该只接受变量、属性和索引器。
有趣的是,它们也接受 ParanthesisedExpressions,例如代码 ++(x);
这有语法上的原因吗?除了 ParanthesizedExpressionSyntax 在语义上等同于 property/indexer/variable?
之外,是否还有 ++(..something here..) 起作用的其他情况
因为C#语言规范允许。 preincrement operator 的规格是:
pre_increment_expression
: '++' unary_expression
;
unary_expression 的规格是:
unary_expression
: primary_expression
| null_conditional_expression
| '+' unary_expression
| '-' unary_expression
| '!' unary_expression
| '~' unary_expression
| pre_increment_expression
| pre_decrement_expression
| cast_expression
| await_expression
| unary_expression_unsafe
;
最后,primary_expression 允许括号:
primary_expression
: primary_no_array_creation_expression
| array_creation_expression
;
primary_no_array_creation_expression
: literal
| interpolated_string_expression
| simple_name
| parenthesized_expression <<--- 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
| nameof_expression
| anonymous_method_expression
| primary_no_array_creation_expression_unsafe
;
所以现在的问题是:为什么 pre_increment_expression
允许 unary_expression
?因为备选方案更难指定、开发和测试。另一种方法是写这样的东西:
pre_increment_expression
: '++' pre_increment_expression_allowed
;
pre_increment_expression_allowed
: element_access
| member_access
| some other expressions
;
如果不重用现有表达式,则必须考虑要允许的所有表达式,这可能会变得非常复杂,然后开发新的语法树解析来支持该表达式。
复杂的例子:
请注意,可以编写以下内容(虽然意义不大,但仍然如此):
void Main()
{
++(new MyClass().Prop);
}
public class MyClass
{
public int Prop {get;set;}
}
我正在尝试了解 C# 分析器和编译器的工作原理。
根据文档,像 pre-inc 和 post-inc 这样的一元运算符应该只接受变量、属性和索引器。
有趣的是,它们也接受 ParanthesisedExpressions,例如代码 ++(x);
这有语法上的原因吗?除了 ParanthesizedExpressionSyntax 在语义上等同于 property/indexer/variable?
之外,是否还有 ++(..something here..) 起作用的其他情况因为C#语言规范允许。 preincrement operator 的规格是:
pre_increment_expression
: '++' unary_expression
;
unary_expression 的规格是:
unary_expression
: primary_expression
| null_conditional_expression
| '+' unary_expression
| '-' unary_expression
| '!' unary_expression
| '~' unary_expression
| pre_increment_expression
| pre_decrement_expression
| cast_expression
| await_expression
| unary_expression_unsafe
;
最后,primary_expression 允许括号:
primary_expression
: primary_no_array_creation_expression
| array_creation_expression
;
primary_no_array_creation_expression
: literal
| interpolated_string_expression
| simple_name
| parenthesized_expression <<--- 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
| nameof_expression
| anonymous_method_expression
| primary_no_array_creation_expression_unsafe
;
所以现在的问题是:为什么 pre_increment_expression
允许 unary_expression
?因为备选方案更难指定、开发和测试。另一种方法是写这样的东西:
pre_increment_expression
: '++' pre_increment_expression_allowed
;
pre_increment_expression_allowed
: element_access
| member_access
| some other expressions
;
如果不重用现有表达式,则必须考虑要允许的所有表达式,这可能会变得非常复杂,然后开发新的语法树解析来支持该表达式。
复杂的例子:
请注意,可以编写以下内容(虽然意义不大,但仍然如此):
void Main()
{
++(new MyClass().Prop);
}
public class MyClass
{
public int Prop {get;set;}
}