什么是“主要表达”?

时间:2013-03-28 06:18:50

标签: parsing powershell

在PowerShell语言规范中,语法有一个名为“Primary Expression”的术语。

primary-expression:
    value
    member-access
    element-access
    invocation-expression
    post-increment-expression
    post-decrement-expression

从语义上讲,什么是用于描述的主要表达?

4 个答案:

答案 0 :(得分:1)

据我了解,这有两个部分:

  1. 正式语法会破坏表达式之类的内容,因此运算符优先级是隐式的。

    EG。如果语法

    expression:
      value
      expression * expression
      expression + expression
      …
    

    需要有一个单独的机制来将*定义为具有比+更高的优先级。这个 在使用工具将语法直接转换为tokeniser / parser时,这一点变得非常重要。 1

  2. 有许多不同的特定规则(考虑PowerShell中的运算符数量),使用较少的规则将难以理解,因为每个规则都会很长。


  3. 1 我怀疑PowerShell不是这种情况,因为它是高度上下文敏感的(快速vs命令模式,然后考虑调用非内置可执行文件)。但是这种跨语言的语法往往有很多共同之处,所以风格也可以延续(不要重新发明轮子)。

答案 1 :(得分:1)

我的理解是,表达式是命令/参数和/或运算符/操作数的排列,它们一起执行并生成一个动作或产生一个结果(即使它是$ null)可以分配给变量或发送管道。术语“主表达式”用于区分整个表达式与可能包含在其中的任何子表达式$()。

答案 2 :(得分:0)

认为$(很多陈述)就像一个复杂的表达 在powershell中,大多数事情都可以表达得像 $ a = if($ y){1} else {2} 所以主要表达可能是经典表达的最低共同点 一个返回值的东西 是否显式值,调用某些东西,从变量$ x.y获取变量或属性,或者是增量操作的结果$ z ++ 但即使是一个简单的数学“表达式”也不会匹配这个4 + 2 +(3/4),这将更像是一个复杂的表达。

所以我在考虑它背后的原因,起初有人提到它可以帮助确定命令/表达模式,但调查不是它。然后我想也许它可以在命令模式下作为参数明确地传递,但那不是它,因为如果你将$ x ++作为参数传递给cmdlet,你会得到一个字符串。

我认为它可能只是表达式的最小公分母,一个构建块,所以接下来的问题是语法包含的其他表达式,以及这个表达式在哪里?

答案 3 :(得分:0)

我非常有限的经验表明,主变量是指不能以多种方式解析的表达式(或子表达式),无论其优先级或关联性如何。它们具有足够的语法锚,以至于它们实际上是无法协商的,例如ID'('ID')'只能匹配。 parens保证了这一点,并且没有运算符允许对优先级做出任何决定。

在匹配表达式树时,通常在“ primary_expr”规则下具有一组这些子表达式。任何子表达式都可以按照您喜欢的任何方式进行匹配,因为它们都是由语法绝对确定的。此后的所有内容都必须在语法上仔细排序,以确保正确的优先级和关联性。

对此解释here有所支持。