式の文法

Note

Microsoft Power Fx は、キャンバス アプリ用の数式言語の新しい名前です。 これらの記事は、キャンバス アプリから言語を抽出し、その他の Microsoft Power Platform 製品と統合して、オープン ソースとして利用できるようにするために進行中の作業です。 言語の紹介のために Microsoft Power Fx の概要 から開始します。

Microsoft Power Fx は名前を式にバインドする数式に基づいています。 Excel ワークシートと同様に、式へのインバウンド依存関係が変更されると、式が再計算されて名前の値が変更され、その他の数式に再計算がカスケードされる可能性があります。

この文法は、数式の式の部分をカバーしています。 数式を作成するための名前へのバインドは、Power Fx の統合方法によって異なります。 ワークシートでバインディング構文は公開されておらず、A1 セルに =B1 と入力した場合のように式が記述されている場所によって暗示されます。 場合によっては、バインディングがまったく必要なく、Power Fx が式エバリュエーターとして使用されます。たとえば、データベース テーブルの計算列をサポートする場合などです。 Power Apps の場合、Power Apps Studio 外での使用のための YAML に基づいたシリアル化形式 を使用して Power Apps Studio で作業するときにバインディングが暗示されます。

文法規則

字句と構文の文法は、文法プロダクションを使用して表されます。 各文法プロダクションによって、非終端記号と、その非終端記号から非終端記号または終端記号のシーケンスへの可能な展開が定義されます。 文法プロダクションでは、非終端の記号は斜体で表示され、終端記号は固定幅フォントで表示されます。

文法プロダクションの最初の行は、定義される非終端記号の名前と、その後にコロンを付けたものです。 連続してインデントされた各行には、非終端記号または終端記号のシーケンスとして表された、非終端記号の可能な展開が含まれます。 たとえば、次のようなプロダクションの場合:

  GlobalIdentifier:
    [@識別子]

GlobalIdentifier をトークン [@ で構成されると定義し、識別子につづき、またトークンにつづきます]

1 つの非終端記号に可能な展開が複数ある場合は、代替の展開が別の行に示されます。 省略可能な記号を示すには、添字 "opt" が使用されます。 たとえば、次のようなプロダクションの場合:

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

これは次の短縮形です。

  FunctionCall:
    FunctionIdentifier()
    FunctionIdentifier(FunctionArguments)

通常、代替の展開は別の行に示されます。ただし、多数の代替がある場合は、1 行に示された展開の一覧の前に「次のいずれか」という語句が含まれることがあります。 これは、それぞれの代替を別々の行に一覧表示することに対する簡便な方法です。

たとえば、次のようなプロダクションの場合:

  DecimalDigit:次のいずれか
    0123456789

これは次の短縮形です。

  DecimalDigit:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

字句解析

字句単位の生成は、Power Fx 式の字句文法を定義します。 すべての有効な Power Fx 式は、この文法に準拠しています。

  ExpressionUnit:
    ExpressionElementsopt

  ExpressionElements:
    ExpressionElement
    ExpressionElementExpressionElementsopt

  ExpressionElement:
    Whitespace
    Comment

字句のレベルでは、Power Fx 式は WhitespaceCommentToken 要素のストリームで構成されます。 次の各セクションで、それぞれのプロダクションについて説明します。 構文の文法においては、トークン 要素のみが有効です。

空白

空白は、Power Apps ドキュメント内のコメントとトークンを区切るために使用されます。

  Whitespace:
    Unicode スペース区切り文字 (クラス Zs)
    Unicode 行区切り文字 (クラス Zl)
    Unicode 段落区切り文字 (クラス Zp)
    水平タブ文字 (U+0009)
    ライン フィード文字 (U+000A)
    垂直タブ文字 (U+000B)
    フォーム フィード文字 (U+000C)
    復帰文字 (U+000D)
    次の行の文字 (U+0085)

コメント

2 つの形式のコメントがサポートされています。

  • 単一行コメントは、// 文字で始まり、ソース行の末尾まで拡張されます。
  • 区切られたコメントは、/* 文字で始まり、*/ 文字で終わります。 区切られたコメントは、複数行にまたがることがあります。

  コメント:
    DelimitedComment
    SingleLineComment

  SingleLineComment:
    //SingleLineCommentCharactersopt

  SingleLineCommentCharacters:
    SingleLineCommentCharacter
    SingleLineCommentCharacterSingleLineCommentCharactersopt

  SingleLineCommentCharacter:
    NewLineCharacter を除くすべての Unicode 文字

  DelimitedComment:
    /*DelimitedCommentCharactersopt*/

  DelimitedCommentCharacters:
    DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentAfterAsteriskCharacters:
    DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentCharactersNoAsterisk:
    * (アスタリスク) を除く任意の Unicode 文字

  DelimitedCommentNoSlashAsteriskCharacter:
    / (スラッシュ) または * (アスタリスク) を除く任意の Unicode 文字

コメントは入れ子にはなりません。 文字シーケンス /**/ は単一行コメント内で特別な意味を持ちません。また、///* の文字シーケンスは、区切られたコメント内で特別な意味を持ちません。

コメントは、テキスト リテラル文字列内では処理されません。

次の例には、2 つの区切られたコメントが含まれています。

/* Hello, world
*/
"Hello, world"    /* This is an example of a text literal */

次の例には、3 つの単一行コメントが含まれています。

// Hello, world
//
"Hello, world"    // This is an example of a text literal

リテラル

リテラルは、値のソース コード表現です。

  リテラル:
    LogicalLiteral
    NumberLiteral
    TextLiteral

論理リテラル

true および false の値を記述するために使用される論理リテラルでは、論理値が生成されます。

  LogicalLiteral:次のいずれか
    truefalse

数値リテラル

数値を記述するために使用される数値リテラルでは、数値が生成されます。

  NumberLiteral:
    DecimalDigitsExponentPartopt
    DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
    DecimalSeparatorDecimalDigitsExponentPartopt

  DecimalDigits:
    DecimalDigit
    DecimalDigitsDecimalDigit

  DecimalDigit:次のいずれか
    0123456789

  ExponentPart:
    ExponentIndicatorSignoptDecimalDigits

  ExponentIndicator:次のいずれか
    eE

  Sign:次のいずれか
    +-

テキスト リテラル

Unicode 文字のシーケンスを記述するために使用されるテキスト リテラルでは、テキスト値が生成されます。 テキストリテラルは二重引用符で囲まれています。 テキスト値に二重引用符を含めるには、次の例に示すように二重引用符を繰り返します。

"The ""quoted"" text" // The "quoted" text

  TextLiteral:
    "TextLiteralCharactersopt"

  TextLiteralCharacters:
    TextLiteralCharacterTextLiteralCharactersopt

  TextLiteralCharacter:
    TextCharacterNoDoubleQuote
    DoubleQuoteEscapeSequence

  TextCharacterNoDoubleQuote:
    二重引用符を除くすべての Unicode コード ポイント

  DoubleQuoteEscapeSequence:
    ""

識別子

識別子は、値を参照するために使用される名前です。 識別子は、標準識別子または一重引用符で囲まれた識別子とすることができます。

  識別子:
    IdentifierNameOperatorContextKeywordを除く

  IdentifierName:
    IdentifierStartCharacterIdentifierContinueCharactersopt
    'SingleQuotedIdentifier'

  IdentifierStartCharacter:
    LetterCharacter
    _

  IdentifierContinueCharacter:
    IdentifierStartCharacter
    DecimalDigitCharacter
    ConnectingCharacter
    CombiningCharacter
    FormattingCharacter

  IdentifierContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharactersopt

  LetterCharacter:
    大文字 (Lu) または 小文字 (Ll)のクラスの Unicode 文字
    タイトル文字 (Lt) クラスの任意の Unicode 文字
    修飾 (Lm)クラス、または その他 (Lo) クラスの任意の Unicode 文字
    数字文字 (Nl) クラスの任意の Unicode 文字

  CombiningCharacter:
    前進を伴わない記号 (Mn)クラス、または 前進を伴う結合記号 (Mc) クラスの任意の Unicode 文字

  DecimalDigitCharacter:
    10 進数字 (Nd) クラスの任意の Unicode 文字

  ConnectingCharacter:
    接続句読点 (Pc) クラスの任意の Unicode 文字

  FormattingCharacter:
    書式 (Cf) クラスの任意の Unicode 文字

一重引用符で囲まれた識別子

単一引用符で囲まれた識別子には、キーワード、空白、コメント、および演算子など、任意の Unicode 文字のシーケンスを識別子として含めることができます。 単一引用符の文字は、2 つの単一引用符のエスケープ シーケンスでサポートされます。

  SingleQuotedIdentifier:
    SingleQuotedIdentifierCharacters

  SingleQuotedIdentifierCharacters:
    SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

  SingleQuotedIdentifierCharacter:
    TextCharactersNoSingleQuote
    SingleQuoteEscapeSequence

  TextCharactersNoSingleQuote:
    ' (U+0027) を除く任意の Unicode 文字

  SingleQuoteEscapeSequence:
    ''

曖昧さ回避された識別子

  DisambiguatedIdentifier:
    TableColumnIdentifier
    GlobalIdentifier

  TableColumnIdentifier:
    識別子[@識別子]

  GlobalIdentifier:
    [@Identifier]

コンテキスト キーワード

  ContextKeyword:
    Parent
    Self
    ThisItem
    ThisRecord

大文字と小文字の区別

Power Apps 識別子では大文字と小文字が区別されます。 作成ツールは、計算式が記述されているとき、大文字と小文字を自動的に変更します。

区切り文字

  DecimalSeparator:
    . 10 進数の値の区切り記号としてドットを使用する言語の (ドット)1.23
    ,たとえば など、10 進数の区切り文字としてカンマを使用する言語 (カンマ)1,23

  ListSeparator:
    ,DecimalSeparator. (ドット) の場合は (カンマ)
    ;DecimalSeparator, (コンマ) の場合、(セミコロン)

  ChainingSeparator:
    ;DecimalSeparator. (ドット) の場合、(セミコロン)
    ;;DecimalSeparator, (コンマ) の場合、(二重セミコロン)

演算子

演算子は、1 つ以上のオペランドに関係する操作を記述するために、数式で使用されます。 たとえば、式 a + b では、+ 演算子を使用して、a および b の 2 つのオペランドが追加されます。

  演算子:
    BinaryOperator
    BinaryOperatorRequiresWhitespace
    PrefixOperator
    PrefixOperatorRequiresWhitespace
    PostfixOperator

  BinaryOperator:次のいずれか
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

  BinaryOperatorRequiresWhitespace:
    AndWhitespace
    OrWhitespace

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotWhitespace

  PostfixOperator:
    %

リファレンス演算子

  ReferenceOperator:次のいずれか
    .!

オブジェクト参照

  リファレンス:
    BaseReference
    BaseReferenceReferenceOperatorReferenceList

  BaseReference:
    識別子
    DisambiguatedIdentifier
    ContextKeyword

  ReferenceList:
    識別子
    IdentifierReferenceOperatorReferenceList

インライン レコード

  InlineRecord:
    {InlineRecordListopt}

  InlineRecordList:
    識別子:Expression
    識別子:ExpressionListSeparatorInlineRecordList

インライン テーブル

  InlineTable:
    [InlineTableListopt]

  InlineTableList:
    Expression
    ExpressionListSeparatorInlineTableList

Expression

  Expression:
    リテラル
    リファレンス
    InlineRecord
    InlineTable
    FunctionCall
    (Expression)
    PrefixOperatorExpression
    ExpressionPostfixOperator
    ExpressionBinaryOperatorExpression

チェーン表現

  ChainedExpression:
    Expression
    ExpressionChainingSeparatorChainedExpressionopt

関数呼び出し

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

  FunctionIdentifier:
    識別子
    Identifier.FunctionIdentifier

  FunctionArguments:
    ChainedExpression
    ChainedExpressionListSeparatorFunctionArguments