在PowerShell语法中,`lvalueExpression`规则是什么?

时间:2012-08-14 18:56:32

标签: parsing powershell grammar ebnf

我正在审核此处发布的PowerShell语法:http://www.manning.com/payette/AppCexcerpt.pdf

(我认为自PowerShell v1以来它没有更新,并且有一些拼写错误。所以,它显然不是真正的 PowerShell语法,而是一个面向人的文档。)

在C.2.1节中,它说:

<lvalueExpression> = <lvalue> [? |? <lvalue>]*

问号是什么意思?我不知道它是否意味着“匹配任何字符”或“匹配问号”或者这是一个错字。

我不确定这是打算匹配的输入,但也许就是这样:

$a,$b = 1, 2

在哪种情况下,问号可能是逗号?

1 个答案:

答案 0 :(得分:1)

根据其在上一条规则(<assignmentStatementRule> = <lvalueExpression> <AssignmentOperatorToken> <pipelineRule>)中的使用情况,Appendix CWindows PowerShell in Action中的lvalueExpression似乎与expression相对应The PowerShell Language SpecificationJoey相关联的{{3}}的B.2.3 。匹配它比这更困难,但我还是会添加一些推测:)

?中的[? |? <lvalue>]*字符很可能是错误的。如果它已用于表示“前一个令牌是可选的”,那么:

  • 应用的[|令牌应该被引用
  • 只有[作为值表达式的一部分才有意义,但后面的propertyOrArrayReferenceOperator规则已涵盖索引
  • ?未在语法中的任何其他位置使用,但{0|1} 多次使用以表示“可以显示为零或一次”

鉴于该部分中第一条规则末尾与[ '|' <cmdletCall> ]*的相似性,它可能是一个复制粘贴错误,并且由“智能引用”往返编码错误复杂化。假设这是为了稍后编辑而复制的,那么?|?可能已成为'.'来表示多个属性访问(但同样,propertyOrArrayReferenceOperator规则涵盖了这一点。)

虽然基于 C.2.1 部分末尾的声明“[管道规则]也处理解析赋值表达式”,lvalueExpression可能是为了列出所有可分配的simpleLvalue以外的表达式(例如cast-expression[int]$x = 1array-literal-expression$a,$b,$c = 1,2,3)等。