Ngữ pháp biểu thức

Lưu ý

Microsoft Power Fx là tên mới của ngôn ngữ công thức cho ứng dụng canvas. Những bài viết này được thực hiện khi chúng tôi trích xuất ngôn ngữ từ các ứng dụng canvas, tích hợp ngôn ngữ đó với các sản phẩm khác của Microsoft Power Platform và hiển thị dưới dạng nguồn mở. Bắt đầu từ phần Microsoft Power Fx Tổng quan để xem thông tin giới thiệu cho ngôn ngữ này.

Microsoft Power Fx dựa trên các công thức liên kết tên với một biểu thức. Cũng giống như trong trang tính Excel, khi các phần phụ thuộc trả về theo sự thay đổi của biểu thức, thì biểu thức sẽ được tính toán lại và giá trị của tên sẽ thay đổi, có thể xếp tầng phép tính toán lại thành các công thức khác.

Ngữ pháp này bao gồm phần biểu thức của công thức. Việc ràng buộc với một tên để tạo công thức sẽ phụ thuộc vào cách Power Fx được tích hợp. Trên các trang tính, cú pháp ràng buộc không hiển thị mà được ngụ ý theo vị trí viết biểu thức, chẳng hạn như nhập =B1 vào ô A1. Trong một số trường hợp, hoàn toàn không cần ràng buộc và Power Fx được dùng làm trình đánh giá biểu thức, chẳng hạn như trong việc hỗ trợ các cột được tính toán của một bảng cơ sở dữ liệu. Đối với Power Apps, phần ràng buộc được ngụ ý khi làm việc trong Power Apps Studio với một định dạng tuần tự hóa dựa trên YAML để sử dụng bên ngoài Power Apps Studio.

Quy ước ngữ pháp

Ngữ pháp về từ vựng và cú pháp được thể hiện qua cách dùng sản phẩm ngữ pháp. Mỗi sản phẩm ngữ pháp xác định một ký hiệu không phải đầu cuối và khả năng mở rộng của ký hiệu không phải đầu cuối đó thành chuỗi các ký hiệu không phải đầu cuối hoặc đầu cuối. Trong các sản phẩm ngữ pháp, các ký hiệu không phải đầu cuối được hiển thị bằng kiểu in nghiêng và các ký hiệu đầu cuối được hiển thị bằng phông chữ có độ rộng cố định.

Dòng đầu tiên của một sản phẩm ngữ pháp là tên của ký hiệu không phải đầu cuối đang được xác định, theo sau là dấu hai chấm. Mỗi dòng thụt lề liên tiếp chứa phần mở rộng có thể có của ký hiệu không phải đầu cuối được đưa ra dưới dạng một chuỗi các ký hiệu không đầu cuối hoặc đầu cuối. Ví dụ: sản phẩm:

   GlobalIdentifier:
     [@ Identifier]

xác định một GlobalIdentifier bao gồm mã thông báo [@, theo sau là một Identifier, tiếp theo là mã thông báo ].

Khi có nhiều khả năng mở rộng một ký hiệu không phải đầu cuối, các lựa chọn thay thế được liệt kê trên các dòng riêng biệt. Ký hiệu "opt" dùng để thể hiện biểu tượng tùy chọn. Ví dụ: sản phẩm:

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

là viết tắt của:

   FunctionCall:
     FunctionIdentifier()
     FunctionIdentifier(FunctionArguments)

Các lựa chọn thay thế thường được liệt kê trên các dòng riêng biệt, mặc dù trong trường hợp có nhiều lựa chọn thay thế, cụm từ "một trong số" có thể đứng trước danh sách các mở rộng được đưa ra trên một dòng. Đây chỉ đơn giản là cách viết tắt để liệt kê từng lựa chọn thay thế trên các dòng riêng biệt.

Ví dụ: sản phẩm:

   DecimalDigit:một trong số
    0123456789

là viết tắt của:

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

Phân tích từ vựng

Quá trình tạo đơn vị từ vựng sẽ xác định ngữ pháp từ vựng cho một biểu thức Power Fx. Mọi biểu thức Power Fx hợp lệ đều tuân theo ngữ pháp này.

   ExpressionUnit:
     ExpressionElementsopt

   ExpressionElements:
     ExpressionElement
     ExpressionElementExpressionElementsopt

   ExpressionElement:
     Whitespace
     Comment

Ở cấp độ từ vựng, biểu thức Power Fx bao gồm một luồng gồm các phần từ Whitespace, CommentToken. Mỗi sản phẩm này được đề cập trong các phần sau. Chỉ các thành phần Mã thông báo có ý nghĩa trong ngữ pháp cú pháp.

Khoảng trắng

Khoảng trắng được sử dụng để phân tách các nhận xét và mã thông báo trong tài liệu Power Apps.

   Whitespace:
    bất kỳ dấu phân cách Unicode Space nào (lớp Z)
    bất kỳ dấu phân cách Unicode Line nào (lớp Zl)
    bất kỳ dấu phân tách Unicode Paragraph nào (lớp Zp)
    Ký tự tab ngang (U+0009)
    Ký tự nguồn cấp dữ liệu dòng (U+000A)
    Ký tự tab dọc (U+000B)
    Ký tự nguồn cấp dữ liệu biểu mẫu (U+000C)
    Ký tự trả về vận chuyển (U+000D)
    Ký tự dòng tiếp theo (U+0085)

Nhận xét

Hai hình thức nhận xét được hỗ trợ:

  • Nhận xét một dòng bắt đầu bằng các ký tự // và kéo dài đến cuối dòng nguồn.
  • Nhận xét được phân tách bắt đầu bằng các ký tự /* và kết thúc bằng các ký tự */. Nhận xét được phân tách có thể kéo dài nhiều dòng.

   Comment:
     DelimitedComment
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersopt

   SingleLineCommentCharacters:
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter:
    bất kỳ ký tự Unicode nào ngoại trừ ký tự NewLineCharacter

   DelimitedComment:
     /* DelimitedCommentCharactersopt*/

   DelimitedCommentCharacters:
     DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentAfterAsteriskCharacters:
     DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentCharactersNoAsterisk:
    bất kỳ ký tự Unicode nào ngoại trừ * (dấu hoa thị)

   DelimitedCommentNoSlashAsteriskCharacter:
    bất kỳ ký tự Unicode nào ngoại trừ / (dấu gạch chéo) hoặc * (dấu hoa thị)

Nhận xét không được lồng vào nhau. Các chuỗi ký tự /**/ không có ý nghĩa đặc biệt trong bình luận một dòng và các chuỗi ký tự ///* không có ý nghĩa đặc biệt trong nhận xét được phân tách.

Nhận xét không được xử lý trong chuỗi văn bản-ký tự.

Ví dụ sau bao gồm hai nhận xét được phân cách:

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

Các ví dụ sau đây bao gồm ba nhận xét một dòng:

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

Ký tự

Ký tự là một mã nguồn đại diện cho một giá trị.

   Literal:
     LogicalLiteral
     NumberLiteral
     TextLiteral

Ký tự lôgic

Ký tự logic được sử dụng để viết các giá trị đúng và sai, đồng thời tạo ra một giá trị logic.

   LogicalLiteral:một trong số
    truefalse

Ký tự số

Ký tự số được sử dụng để viết một giá trị số và tạo ra một giá trị số.

   NumberLiteral:
     DecimalDigitsExponentPartopt
     DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
     DecimalSeparatorDecimalDigitsExponentPartopt

   DecimalDigits:
     DecimalDigit
     DecimalDigitsDecimalDigit

   DecimalDigit:một trong số
    0123456789

   ExponentPart:
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator:một trong số
    eE

   Sign:một trong số
    +-

Ký tự văn bản

Ký tự văn bản được sử dụng để viết một chuỗi các ký tự Unicode và tạo ra một giá trị văn bản. Các ký tự văn bản được đặt trong dấu ngoặc kép. Để bao gồm dấu ngoặc kép trong giá trị văn bản, hãy lặp lại dấu ngoặc kép, như thể hiện trong ví dụ sau:

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

   TextLiteral:
     " TextLiteralCharactersopt"

   TextLiteralCharacters:
     TextLiteralCharacterTextLiteralCharactersopt

   TextLiteralCharacter:
     TextCharacterNoDoubleQuote
     DoubleQuoteEscapeSequence

   TextCharacterNoDoubleQuote:
    bất kỳ điểm mã Unicode nào ngoại trừ dấu ngoặc kép

   DoubleQuoteEscapeSequence:
    ""

Identifiers

Mã định danh là tên được sử dụng để tham chiếu đến một giá trị. Số nhận dạng có thể là số nhận dạng thông thường hoặc số nhận dạng được trích dẫn đơn lẻ.

   Identifier:
     IdentifierNamechứkhông phảiOperatorhoặcContextKeyword

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LetterCharacter
    _

   IdentifierContinueCharacter:
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     CombiningCharacter
     FormattingCharacter

   IdentifierContinueCharacters:
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   LetterCharacter:
    bất kỳ ký tự Unicode nào thuộc lớp Chữ hoa (Lu) hoặc Chữ thường (Ll)
    bất kỳ ký tự Unicode nào thuộc lớp Chữ hoa đầu mỗi từ (Lt)
    bất kỳ ký tự Unicode nào thuộc lớp Bổ nghĩa chữ cái (Lm) hoặc Chữ cái khác (Lo)
    bất kỳ ký tự Unicode nào thuộc lớp Chữ cái số (Nl)

   CombiningCharacter:
    bất kỳ ký tự Unicode nào thuộc lớp Dấu không có khoảng cách (Mn) hoặc Dấu kết hợp khoảng cách (Mc)

   DecimalDigitCharacter:
    bất kỳ ký tự Unicode nào thuộc lớp Số thập phân (Nd)

   ConnectingCharacter:
    bất kỳ ký tự Unicode nào thuộc lớp Dấu nối câu (Pc)

   FormattingCharacter:
    bất kỳ ký tự Unicode nào thuộc lớp Định dạng (Cf)

Số nhận dạng được trích dẫn đơn lẻ

Mã định danh được trích dẫn duy nhất có thể chứa bất kỳ chuỗi ký tự Unicode nào được sử dụng làm mã định danh, bao gồm từ khóa, khoảng trắng, chú thích và toán tử. Các ký tự trong dấu ngoặc đơn được hỗ trợ với một chuỗi thoát gồm hai dấu ngoặc đơn.

   SingleQuotedIdentifier:
     SingleQuotedIdentifierCharacters

   SingleQuotedIdentifierCharacters:
     SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

   SingleQuotedIdentifierCharacter:
     TextCharactersNoSingleQuote
     SingleQuoteEscapeSequence

   TextCharactersNoSingleQuote:
    bất kỳ ký tự Unicode nào ngoại trừ ' (U+0027)

   SingleQuoteEscapeSequence:
    ''

Mã nhận dạng được phân loại

   DisambiguatedIdentifier:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identifier[@Identifier]

   GlobalIdentifier:
     [@ Identifier]

Từ khóa theo ngữ cảnh

   ContextKeyword:
    Parent
    Self
    ThisItem
    ThisRecord

Phân biệt chữ hoa/chữ thường

Số nhận dạng Power Apps có phân biệt chữ hoa chữ thường. Công cụ quy tắc sẽ tự động thay đổi chúng thành trường hợp chính xác khi một công thức đang được viết.

Dấu phân tách

   DecimalSeparator:
     . (dấu chấm) đối với những ngôn ngữ sử dụng dấu chấm để phân cách số thập phân, chẳng hạn như 1.23
     , (dấu phẩy) đối với những ngôn ngữ sử dụng dấu phẩy để phân cách số thập phân, chẳng hạn như 1,23

   ListSeparator:
     , (dấu phẩy) nếu DecimalSeparator. (dấu chấm)
     ; (dấu chấm phẩy) nếu DecimalSeparator, (dấu phẩy)

   ChainingSeparator:
     ; (dấu chấm phẩy) nếu DecimalSeparator. (dấu chấm)
     ;; (2 dấu chấm phẩy) nếu DecimalSeparator, (dấu phẩy)

Toán tử

Các toán tử được sử dụng trong công thức để mô tả các phép toán liên quan đến một hoặc nhiều toán hạng. Ví dụ: biểu thức a + b sử dụng toán tử + để thêm hai toán hạng ab.

   Operator:
     BinaryOperator
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

   BinaryOperator:một trong số
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

   BinaryOperatorRequiresWhitespace:
     And Whitespace
     Or Whitespace

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitespace:
     Not Whitespace

   PostfixOperator:
    %

Toán tử tham chiếu

   ReferenceOperator:một trong số
    .!

Đối tượng tham chiếu

   Reference:
     BaseReference
     BaseReferenceReferenceOperatorReferenceList

   BaseReference:
     Identifier
     DisambiguatedIdentifier
     ContextKeyword

   ReferenceList:
     Identifier
     IdentifierReferenceOperatorReferenceList

Bản ghi nội tuyến

   InlineRecord:
     { InlineRecordListopt}

   InlineRecordList:
     Identifier:Expression
     Identifier:ExpressionListSeparatorInlineRecordList

Bảng nội tuyến

   InlineTable:
     [ InlineTableListopt]

   InlineTableList:
     Expression
     ExpressionListSeparatorInlineTableList

Expression

   Expression:
     Literal
     Reference
     InlineRecord
     InlineTable
     FunctionCall
     ( Expression)
     PrefixOperatorExpression
     ExpressionPostfixOperator
     ExpressionBinaryOperatorExpression

Biểu thức chuỗi

   ChainedExpression:
     Expression
     ExpressionChainingSeparatorChainedExpressionopt

Lệnh gọi hàm

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identifier
     Identifier.FunctionIdentifier

   FunctionArguments:
     ChainedExpression
     ChainedExpressionListSeparatorFunctionArguments