Споделяне чрез


Граматика на израза

Бележка

Microsoft Power Fx е новото име за езика на формулите за приложения на платното. Тези статии са в процес на разработка, тъй като извличаме езика от приложенията на платното и го интегрираме с други продукти на Microsoft Power Platform и го направете достъпен като отворен код. Започнете с общ преглед на Microsoft Power Fx за въведение в езика.

Microsoft Power Fx се основава на формули, които обвързват име с израз. Точно както в работните листове на Excel, тъй като входящите зависимости към промяната на израза, изразът се преизчислява и стойността на името се променя, евентуално каскадно преизчисляване в други формули.

Тази граматика обхваща изразната част на формулата. Обвързването с име за създаване на формула зависи от начина на интегриране на Power Fx. В работни листове синтаксисът на обвързване не е изложен, това се подразбира от местоположението, където е записан изразът, например въвеждане на =B1 в клетка А1. В някои случаи изобщо не се изисква обвързване и Power Fx се използва като оценител на изрази, например при поддържане на изчислени колони от таблица на базата данни. За Power Apps обвързването се подразбира при работа в Power Apps Studio с формат за сериализация, базиран на YAML за използване извън Power Apps Studio.

Граматични конвенции

Лексикалните и синтактичните граматики са представени чрез използване на граматични продукции. Всяка граматична продукция дефинира нетерминален символ и възможните разширения на този нетерминален символ в поредици от нетерминални или терминални символи. В граматичните продукции нетерминалните символи са показани в курсив, а терминалните символи са показани с шрифт с фиксирана ширина.

Първият ред на граматичната продукция е името на нетерминалния символ, който се дефинира, последвано от двоеточие. Всеки последователен отстъпен ред съдържа възможно разширение на нетерминалния символ, даден като последователност от нетерминални или терминални символи. Например продукцията:

  Глобален идентификатор:
    [@Идентификатор]

определя GlobalIdentifier да се състои от маркер [@, последван от Идентификатор, последван от маркер ].

Когато има повече от едно възможно разширяване на нетерминален символ, алтернативите са изброени на отделни редове. Индексът "opt" се използва за обозначаване на незадължителен символ. Например продукцията:

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

е стенография за:

  FunctionCall:
    FunctionIdentifier()
    FunctionIdentifier(FunctionArguments)

Алтернативите обикновено са изброени на отделни редове, макар че в случаите, когато има много алтернативи, фразата "един от" може да предшества списък с разширения, дадени на един ред. Това е просто стенография за изброяване на всяка от алтернативите на отделни редове.

Например продукцията:

  DecimalDigit: едно от
    0123456789

е стенография за:

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

Лексикален анализ

Производството на лексикални единици дефинира лексикалната граматика за израз на Power Fx. Всеки валиден израз на Power Fx съответства на тази граматика.

  Единица за изразяване:
    ExpressionElementsopt

  ExpressionElements:
    ExpressionElement
    ExpressionElementExpressionElementsopt

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

На лексикално ниво изразът Power Fx се състои от поток от елементите Whitespace, Comment и Token. Всяка от тези продукции е разгледана в следващите раздели. Само елементите маркер са значими в синтактичната граматика.

Интервал

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

  Празно пространство:
    който и да е разделител за интервал на Unicode (клас Zs)
    който и да е разделител за ред на Unicode (клас Zl)
    всеки разделител на параграф на Unicode (клас Zp)
    Символ за хоризонтален раздел (U+0009)
    Символ за редово подаване (U+000A)
    Символ за вертикален раздел (U+000B)
    Символ за подаване на формуляр (U+000C)
    Символ за нов ред (U+000D)
    Символ за следващ ред (U+0085)

Коментари

Поддържат се две форми на коментари:

  • Едноредови коментари, които започват с символите // и се простират до края на изходния ред.
  • Разграничени коментари, които започват с символите /* и завършва с символите */. Разграничените коментари могат да обхващат няколко реда.

  Коментар:
    ДелимитиранКоментар
    Едноредов коментар

  SingleLineКоментар:
    //SingleLineCommentCharactersopt

  SingleLineCommentCharacters:
    Символ за коментар на един ред
    SingleLineCommentCharacterSingleLineCommentCharactersopt

  Символ на SingleLineComment:
    всички символи на Unicode с изключение на NewLineCharacter

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

  DelimitedCommentCharacters:
    ДелимитиранКоментарЗнациБез ЗвездичкаРазделителКоментарЗнаци
    *С ограничениеКоментарСледЗвездичкаЗнаци

  DelimitedCommentAfterAsteriskCharacters:
    С ограничениеКоментарНеНаклонена чертаЗвездичкаЗнакс ограничениеКоментарИзбор на знаци
    *С ограничениеКоментарСледЗвездичкаЗнаци

  РазделенКоментарЗнациБез звездичка:
    всеки символ на Unicode с изключение на * (звездичка)

  Ограничен коментарNoSlashAsteriskCharacter:
    всеки символ на Unicode с изключение на / (наклонена черта) или * (звездичка)

Коментарите не са вложени. Последователностите на знаците /* и */ нямат специално значение в рамките на едноредов коментар и последователностите от символи // и /* нямат специално значение в рамките на разграничен-коментар.

Коментарите не се обработват в текстови низове.

Следващият пример включва два разделителни коментара:

/* 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
    DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
    DecimalSeparatorDecimalDigitsExponentPartopt

  Десетични цифри:
    Десетична цифра
    DecimalDigitsDecimalDigit

  DecimalDigit: едно от
    0123456789

  ЕкспонентаЧаст:
    Знак за избор на ExponentIndicator...DecimalDigits

  ExponentIndicator: един от
    eE

  Знак: един от
    +-

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

Текстов литерал се използва за записване на последователност от Unicode символи и създаване на текстова стойност. Текстовите литерали са затворени в двойни кавички. За да включите двойни кавички в текстовата стойност, повторете двойните кавички, както е показано в следния пример:

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

  ТекстЛитерал:
    "TextLiteralCharactersopt"

  TextLiteralCharacters:
    TextLiteralCharacterTextLiteralCharactersopt

  TextLiteralCharacter:
    ТекстХарактерНеДвойно цитиране
    Двойна QuoteEscapeSequence

  ТекстХарактерNoDoubleQuote:
    всяка точка на код на Unicode с изключение на двойна кавичка

  Двойна QuoteEscapeSequence:
    ""

Идентификатори

Идентификаторът е име, използвано за препратка към стойност. Идентификаторите могат да бъдат или регулярни идентификатори, или идентификатори с единична кавичка.

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

  Име на идентификатора:
    ИдентификаторНачаленИдентификатор на символиПродължаванеЗнаци...опция
    'SingleQuotedIdentifier'

  ИдентификаторНачален знак:
    БукваСимвол
    _

  IdentifierContinueCharacter:
    ИдентификаторНачален знак
    Десетичен знакЦифра
    Свързващ характер
    КомбиниранеХарактер
    ФорматиранеСимвол

  IdentifierContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharactersopt

  БукваХарактер:
    всеки Unicode символ на класа Uppercase letter (Lu) или Lowercase letter (Ll)
    всеки Unicode знак на заглавната Titlecase letter (Lt)
    всеки Unicode символ на класа Letter modifier (Lm) или Letter other (Lo)
    всеки Unicode знак на класа Number letter (Lt)

  Комбиниране на характер:
    всеки Unicode символ на класа Non-spacing mark (Mn) или Spacing combining mark (Mc)

  DecimalDigitCharacter:
    всеки Unicode знак от класа Decimal digit (Nd)

  Свързващ характер:
    всеки Unicode знак от препинателните знаци на класа Connector punctuation (Pc)

  FormattingCharacter:
    всеки Unicode знак от класа Format (Cf)

Идентификатори с единични кавички

Единичен цитиран идентификатор може да съдържа всяка последователност от Unicode символи, които да се използват като идентификатор, включително ключови думи, интервали, коментари и оператори. Единичните кавички се поддържат с екранираща последователност от две единични кавички.

  SingleQuotedIdentifier:
    SingleQuotedIdentifierCharacters

  SingleQuotedIdentifierCharacters:
    SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

  SingleQuotedIdentifierCharacter:
    ТекстЗнациНеЕдиничен цитат
    SingleQuoteEscapeSequence

  ТекстСимволиNoSingleQuote:
    всеки символ на Unicode с изключение на ' (U+0027)

  SingleQuoteEscapeSequence:
    ''

Неопределен идентификатор

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

  TableColumnIdentifier:
    Идентификатор[@на идентификатора]

  Глобален идентификатор:
    [@Идентификатор]

Контекстни ключови думи

  ContextKeyword:
    Parent
    Self
    ThisItem
    ThisRecord

Чувствителност за малки и главни букви

Power Apps идентификаторите са чувствителни към малки и големи букви. Инструментът за авторство автоматично ще ги промени в правилния случай, когато се пише формула.

Разделители

  Десетичен разделител:
    . (точка) за езици, които използват точка като разделител за десетични числа, например 1.23
    , (запетая) за езици, които използват запетая като разделител за десетични числа, например 1,23

  Разделител на списъци:
    , (запетая), ако DecimalSeparator е . (точка)
    ; (точка и запетая), ако DecimalSeparator е , (запетая)

  Верижен сепаратор:
    ; (точка и запетая), ако DecimalSeparator е . (точка)
    ;; (двойна точка и запетая), ако DecimalSeparator е , (запетая)

Оператори

Операторите се използват във формули за описване на операции, включващи един или повече операнди. Например изразът a + b използва + оператор, за да добавите двата операнда a и b.

  Оператор:
    Двоичен оператор
    BinaryOperatorRequiresWhitespace
    PrefixOperator
    PrefixOperatorRequiresWhitespace
    PostfixOperator

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

  BinaryOperatorRequiresWhitespace:
    AndПразно
    OrПразно

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotПразно

  PostfixOperator:
    %

Референтен оператор

  ReferenceOperator:един от
    .!

Препратка към обект

  Препратка:
    Базова справка
    BaseReferenceReferenceOperatorReferenceList

  Базова препратка:
    Идентификатор
    Недвусмислен идентификатор
    КонтекстКлючова дума

  Списък с препратки:
    Идентификатор
    ИдентификаторReferenceOperatorReferenceList

Вграден запис

  Вграден запис:
    {Опция за InlineRecordList}

  InlineRecordList:
    Идентификаторен:израз
    Списък с идентификаторни:изрази...InlineRecordList

Вградена таблица

  Вградена таблица:
    [Опция за InlineTableList]

  InlineTableList:
    Изразяване
    ExpressionListSeparatorInlineTableList

Expression

  Изразяване:
    Буквален
    Препратка
    Вграден запис
    Вградена таблица
    FunctionCall
    (Изразяване)
    Израз PrefixOperator...
    ИзразPostfixOperator
    ИзразBinaryOperatorExpression

Верижни изрази

  Верижен израз:
    Изразяване
    ExpressionChainingSeparatorChainedExpressionopt

Извикване на функция

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

  FunctionIdentifier:
    Идентификатор
    Идентификатор.FunctionIdentifier

  FunctionArguments:
    Верижен израз
    ChainedExpressionListSeparatorFunctionArguments