Поділитися через


Граматика виразу

Нотатка

Microsoft Power Fx — це нова назва мови формул для компонованих програм. Робота над цим циклом статей триває, оскільки ми поступово виокремлюємо згадану мову з компонованих програм, інтегруємо її з іншими продуктами Microsoft Power Platform і робимо відповідний код відкритим. Почніть знайомство з мовою формул з огляду Microsoft Power Fx.

Microsoft Power Fx має в своїй основі формули, які зв'язують імена із виразами. Так само, як і в аркушах Excel, при змінах у вхідних залежностях для виразу цей вираз повторно обчислюється, і значення для імені змінюється, також, можливо, викликаючи каскадні зміни у інших формулах.

Ця граматика містить частину виразу формули. Зв’язування з іменем для створення формули залежить від інтегрованого компонента Power Fx. В аркушах синтаксис зв’язування не є явним, він визначається тим розташуванням, де вказано формулу, наприклад, при введені значення =B1 в клітинку A1. У деяких випадках зв’язування не потрібно, і Power Fx використовується як оцінювач виразу, наприклад, для підтримки обчислюваних стовпців таблиці бази даних. Для Power Apps зв'язування визначається при роботі у Power Apps Studio із використанням формату серіалізації на основі YAML для використання поза межами Power Apps Studio.

Граматичні умовні позначення

Лексична та синтаксична граматики представлені використанням граматичних конструкцій. Кожне граматичне виробництво визначає нетермінальний символ і можливі розширення цього нетермінального символу у послідовності нетермінальних або термінальних символів. У граматичних виробництвах нетермінальні символи позначаються курсивом, а термінальні — шрифтом із фіксованою шириною.

Перший рядок граматичної виробництва — це назва нетермінального символу, за яким іде дві крапки. Кожен рядок із відступом наступного порядку може містити розширення незавершального символу, яке вказується у вигляді послідовності незавершальних або завершальних символів. Наприклад, робоче середовище:

  Глобальний ідентифікатор:
    [@Ідентифікатор]

визначає GlobalIdentifier таким, що складається з маркера [@, за яким іде Ідентифікатор, за яким іде маркер ].

Якщо існує кілька можливих розширень нетермінального символу, альтернативні варіанти перелічені в окремих рядках. Нижній індекс «opt» використовується для позначення необов'язкових символів. Наприклад, робоче середовище:

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

скорочено для:

  FunctionCall:
    Ідентифікатор функції (FunctionIdentifier)()
    FunctionIdentifier(FunctionArguments)

Альтернативи зазвичай перелічуються в окремих рядках, проте в тих випадках, коли існує багато альтернатив, фраза «один з» може передувати списку розширень, наведених в одному рядку. Це просто скорочення, яке використовується замість перелічення всіх альтернативних елементів в окремих рядках.

Наприклад, робоче середовище:

  Десяткова цифра: одна з
    0123456789

скорочено для:

  Десяткова цифра:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

Лексичний аналіз

Продукція лексичної одиниці визначає лексичну граматику для виразу Power Fx. Кожний припустимий вираз Power Fx відповідає цій граматиці.

  Одиниця виміру:
    ExpressionElementsopt

  Елементи виразу:
    ExpressionElement
    ExpressionElementExpressionElementsopt

  ExpressionElement:
    Прогалин
    Коментар

На лексичному рівні вираз Power Fx складається з потоку Пробілів, Приміток і Маркерів. Кожна така продукція наведена у розділах нижче. Для синтаксичної граматики важливими є лише елементи Маркера.

Пробіл

Пробіл використовується для розділення приміток і маркерів у документі Power Apps.

  Пробіли:
    будь-який розділювач Юнікод (клас Zs)
    будь-який розділювач рядків Юнікод (клас Zl)
    будь-який розділювач абзаців Юнікод (клас Zp)
    Символ горизонтальної вкладки (U+0009)
    Символ переведення рядка (U+000A)
    Символ вертикальної табуляції (U+000B)
    Символ переведення формату (U+000C)
    Символ повернення каретки (U+000D)
    Символ нового рядка (U+0085)

Коментарі

Підтримуються дві форми приміток:

  • Однорядкові коментарі, які починаються з символів // і продовжуються до кінця поточного рядка.
  • Багаторядкові коментарі, які починаються з символів /* і закінчуються символами */. Багаторядкові коментарі можуть займати кілька рядків.

  Коментар:
    РозмежованийКоментар
    SingleLineComment

  SingleLineКоментар:
    //SingleLineCommentCharactersвибрати

  SingleLineCommentCharacters:
    SingleLineCommentCharacter
    SingleLineCommentCharacterSingleLineCommentCharacteropt

  SingleLineCommentCharacter:
    будь-які символи Unicode, крім NewLineCharacter

  Коментар:
    /*DelimitedCommentCharactersopt*/

  DelimitedCommentCharacters:
    DelimitedCommentCharactersNoAsteriskDelimitedCommentCharacteropt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentAfterAsteriskCharacters:
    DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharacteropt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentCharactersNoAsterisk:
    будь-який символ Юнікод, за винятком * (зірочка)

  DelimitedCommentNoSlashAsteriskCharacter:
    будь-який символ Юнікод, за винятком / (скісна риска) або * (зірочка)

Коментарі не вкладаються один до одного. Послідовності символів /* і */ не мають спеціального значення в межах однорядкового коментаря, а послідовності символів // і /* не мають спеціального значення у межах багаторядкового коментаря.

Коментарі не обробляються в текстово-літеральних рядках.

У наведеному нижче прикладі містяться дві багаторядкові примітки.

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

У наведеному нижче прикладі міститься три однорядкові примітки.

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

Літерали

Літерал — це представлення значення у вигляді вихідного коду.

  Дослівно:
    Логічний літерал
    Числовий літерал
    Текстовий літерал

Логічні літерали

Логічний літерал використовується для записування значень true і false (істина і хибність), а також для отримання логічного значення.

  LogicalLiteral:один з
    truefalse

Цифровий літерал

Числовий літерал використовується для запису числового значення та отримання числового значення.

  Числовий літерал:
    DecimalDigitsExponentPartopt
    DecimalDigitsDecimalDiparatorDecimalDigitsoptExponentPartopt
    DecimalSeparatorDecimalDigitsExponentPartopt

  Десяткові цифри:
    Десяткова цифра
    Десяткові цифриДесяткові цифри

  Десяткова цифра: одна з
    0123456789

  Експонентна частина:
    ЗнакExponentIndicatorопціонDecimalDigits

  Показник експоненти:один з
    eE

  Ознака: один з
    +-

Текстові літерали

Текстовий літерал використовується для запису послідовності символів у форматі Юнікод і отримання текстового значення. Текстові літерали зазначаються у подвійних лапках. Щоб включити до текстового значення подвійні лапки, повторіть подвійні лапки, як показано в наведеному нижче прикладі.

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

  TextLiteral:
    "TextLiteralCharactersвибрати"

  TextLiteralCharacters:
    TextLiteralCharacterTextLiteralCharacteropt

  TextLiteralCharacter:
    TextCharacterNoDoubleQuote
    DoubleQuoteEscape Sequence

  TextCharacterNoDoubleQuote:
    будь-яка точка коду Юнікод крім подвійних лапок

  DoubleQuoteEscapeSequence:
    ""

Identifiers

Ідентифікатор — це ім'я, що використовується для посилання на значення. Ідентифікаторами можуть бути звичайні ідентифікатори або ідентифікатори в одинарних лапках.

  Ідентифікатор:
    IdentifierName, аленеOperatorабоContextKeyword

  Ім'я ідентифікатора:
    IdentifierStartCharacterIdentifierContinueCharacteropt
    'SingleQuotedIdentifier'

  IdentifierStartCharacter:
    Літерний символ
    _

  ІдентифікаторContinueCharacter:
    IdentifierStartCharacter
    Символ десяткового розряду
    Сполучний характер
    Комбінування персонажів
    ФорматуванняСимвол

  IdentifierContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharacteropt

  Літерний характер:
    будь-який символ Юнікод класу Велика літера (Lu) або Мала літера (Ll)
    будь-який символ Юнікод класу Літера заголовка (Lt)
    будь-який символ Юнікод класу Модифікатор літер (Lm) або Інші літери (Lo)
    будь-який символ Юнікод з класу Літера-число (Nl)

  Комбінуючий характер:
    будь-який символ Юнікод класу Нерозривна позначка (Mn) або Позначка комбінованого інтервалу (Mc)

  Символ десяткового розряду:
    будь-який символ Юнікод класу Десяткова цифра (Nd)

  З’єднувальний характер:
    будь-який символ Юнікод класу З’єднуюча пунктуація (Pc)

  Форматування символу:
    будь-який символ Юнікод класу Форматування (Cf)

Ідентифікатори в одинарних лапках

Ідентифікатор в одинарних лапках може містити будь-яку послідовність символів Юнікод, які будуть використовуватися як ідентифікатор, включно з ключовими словами, пробілами, коментарями та операторами. Щоб використати символ одинарних лапок, екрануйте його іншим символом одинарних лапок ('').

  SingleQuotedIdentifier:
    SingleQuotedIdentifierСимволи

  SingleQuotedIdentifierСимволи:
    SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharacteropt

  SingleQuotedIdentifierCharacter:
    TextCharactersNoSingleQuote
    SingleQuoteEscapeSequence

  TextCharactersNoSingleQuote:
    будь-який символ Юнікод, за винятком ' (U+0027)

  SingleQuoteEscapeSequence:
    ''

Однозначний ідентифікатор

  DisambiguatedIdentifier:
    Ідентифікатор TableColumnIdentifier
    Глобальний ідентифікатор

  Ідентифікатор стовпця:
    Ідентифікатор ідентифікатора[@...]

  Глобальний ідентифікатор:
    [@Ідентифікатор]

Ключові слова з контексту

  ContextKeyword:
    Parent
    Self
    ThisItem
    ThisRecord

З урахуванням регістру

У ідентифікаторах Power Apps враховується регістр. При написанні формули засіб створення автоматично встановить для них правильний регістр.

Роздільники

  Роздільник десяткових дробів:
    . (крапка) для мов, які використовують крапку як роздільник для десяткових чисел, наприклад 1.23
    , (кома) для мов, які використовують кому як роздільник для десяткових чисел, наприклад 1,23

  ListSeparator:
    , (кома), якщо DecimalSeparator is ( . крапка)
    ; (крапка з комою), якщо DecimalSeparator дорівнює ( , кома)

  Роздільник ланцюга:
    ; (крапка з комою), якщо DecimalSeparator is ( . крапка)
    ;; (подвійна крапка з комою), якщо DecimalSeparator дорівнює , (кома)

Оператори

Оператори використовуються у формулах для опису операцій із одним або операндами. Наприклад, вираз a + b використовує оператор + для додавання дох операндівa і b.

  Оператор:
    BinaryOperator (Бінарний оператор)
    BinaryOperatorВимагає пробілу
    PrefixOperator (Оператор префікса)
    PrefixOperatorВимагає пробілу
    PostfixOperator

  BinaryOperator:один з
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

  BinaryOperatorВимагаєПробіл:
    AndПрогалин
    OrПрогалин

  PrefixOperator:
    !

  PrefixOperatorВимагаєПробіл:
    NotПрогалин

  PostfixOperator:
    %

Оператор посилання

  ReferenceOperator:один з
    .!

Посилання на об'єкт

  Посилання:
    Базова довідка
    Список посилань BaseReferenceOperator...

  Посилання на основу:
    Ідентифікатор
    DisambiguatedIdentifier
    ContextKeyword

  Список використаної літератури:
    Ідентифікатор
    Список посилань оператора IdentifierReferenceList...

Вбудований запис

  InlineRecord:
    {InlineRecordListopt}

  InlineRecordList:
    Вираз ідентифікатора:...
    Identifier:ExpressionListSeparatorInlineRecordList

Вкладена таблиця

  InlineTable:
    [InlineTableListopt]

  InlineTableList:
    Вираз
    ExpressionListSeparatorInlineTableList

Expression

  Вираз:
    Буквальне
    Посилання
    Вбудований запис
    Вбудована таблиця
    Виклик функцій
    (Вираз)
    Вираз PrefixOperator...
    ВиразPostfixOperator
    ВиразBinaryOperatorВираз

Раціональні вирази

  ChainedExpression:
    Вираз
    ExpressionChainingSeparatorChainedExpressionopt

Виклик функції

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

  Ідентифікатор функції:
    Ідентифікатор
    Ідентифікатор.FunctionIdentifier

  Аргументи функції:
    Ланцюговий вираз
    ChainedExpressionListSeparatorFunctionArguments