Estrutura lexicalLexical Structure

DocumentosDocuments

Um documento do M é uma sequência ordenada de caracteres Unicode.An M document is an ordered sequence of Unicode characters. O M permite o uso de diferentes classes de caracteres Unicode em diferentes partes de um documento do M.M allows different classes of Unicode characters in different parts of an M document. Para obter informações sobre classes de caracteres Unicode, confira O Padrão Unicode, Versão 3.0, seção 4.5.For information on Unicode character classes, see The Unicode Standard, Version 3.0, section 4.5.

Um documento consiste em exatamente uma expressão ou em grupos de definições organizadas em seções.A document either consists of exactly one expression or of groups of definitions organized into sections. As seções são descritas em detalhes no Capítulo 10.Sections are described in detail in Chapter 10. Em termos conceituais, as seguintes etapas são usadas para ler uma expressão de um documento:Conceptually speaking, the following steps are used to read an expression from a document:

  1. O documento é decodificado de acordo com o respectivo esquema de codificação de caracteres em uma sequência de caracteres Unicode.The document is decoded according to its character encoding scheme into a sequence of Unicode characters.

  2. A análise lexical é executada, convertendo assim o fluxo de caracteres Unicode em um fluxo de tokens.Lexical analysis is performed, thereby translating the stream of Unicode characters into a stream of tokens. As subseções restantes desta seção abordam a análise lexical.The remaining subsections of this section cover lexical analysis.

  3. A análise sintática é executada, convertendo assim o fluxo de tokens em um formulário que pode ser avaliado.Syntactic analysis is performed, thereby translating the stream of tokens into a form that can be evaluated. Esse processo é abordado nas seções subsequentes.This process is covered in subsequent sections.

Convenções gramaticaisGrammar conventions

As gramáticas lexical e sintática são apresentadas usando produções gramaticais.The lexical and syntactic grammars are presented using grammar productions. Cada produção de gramática define um símbolo não terminal e as possíveis expansões desse símbolo não terminal em sequências de símbolos terminais ou não terminais.Each grammar production defines a non-terminal symbol and the possible expansions of that nonterminal symbol into sequences of non-terminal or terminal symbols. Em produções de gramática, os símbolos não terminais são mostrados em itálico e os símbolos terminais são mostrados em uma fonte de largura fixa.In grammar productions, _non-terminal+ symbols are shown in italic type, and terminal symbols are shown in a fixed-width font.

A primeira linha de uma produção de gramática é o nome do símbolo não terminal que está sendo definido, seguido por dois-pontos.The first line of a grammar production is the name of the non-terminal symbol being defined, followed by a colon. Cada linha recuada sucessiva contém uma possível expansão do símbolo não terminal fornecida como uma sequência de símbolos terminais ou não terminais.Each successive indented line contains a possible expansion of the nonterminal given as a sequence of non-terminal or terminal symbols. Por exemplo, a produção:For example, the production:

expressão-if:if-expression:
      if condição-if then expressão-true else expressão-false      if if-condition then true-expression else false-expression

define uma expressão-if consistindo do token if, seguido por uma condição-if, seguida pelo token then, seguido por uma expressão-true, seguida pelo token else, seguido por uma expressão-false.defines an if-expression to consist of the token if, followed by an if-condition, followed by the token then, followed by a true-expression, followed by the token else, followed by a false-expression.

Quando há mais de uma possível expansão de um símbolo não terminal, as alternativas são listadas em linhas separadas.When there is more than one possible expansion of a non-terminal symbol, the alternatives are listed on separate lines. Por exemplo, a produção:For example, the production:

lista-de-variáveis:
      variável
      lista-de-variáveis
, variável
variable-list:
      variable
      variable-list
, variable

define uma lista-de-variáveis para consistir de uma variável ou consistir de uma lista-de-variáveis seguida por uma variável.defines a variable-list to either consist of a variable or consist of a variable-list followed by a variable. Em outras palavras, a definição é recursiva e especifica que uma lista de variáveis consiste em uma ou mais variáveis, separadas por vírgulas.In other words, the definition is recursive and specifies that a variable list consists of one or more variables, separated by commas.

Um sufixo subscrito "opt" é usado para indicar um símbolo opcional.A subscripted suffix "opt" is used to indicate an optional symbol. A produção:The production:

especificação-do-campo:field-specification:
      optionalopt nome-do-campo = tipo-do-campo      optionalopt field-name = field-type

é uma versão abreviada de:is shorthand for:

especificação-de-campo:
      nome-do-campo
= tipo-do-campo
field-specification:
      field-name
= field-type

      optional nome-do-campo = tipo-do-campo      optional field-name = field-type

e define uma especificação-do-campo para, opcionalmente, começar com o símbolo do terminal optional seguido por nome-do-campo, o símbolo do terminal = e um tipo-de-campo.and defines a field-specification to optionally begin with the terminal symbol optional followed by a field-name, the terminal symbol =, and a field-type.

As alternativas normalmente são listadas em linhas separadas, porém, nos casos em que há muitas alternativas, a frase "one of" pode preceder uma lista de expansões dadas em uma única linha.Alternatives are normally listed on separate lines, though in cases where there are many alternatives, the phrase "one of" may precede a list of expansions given on a single line. Isso é simplesmente uma forma mais prática do que listar cada uma das alternativas em uma linha separada.This is simply shorthand for listing each of the alternatives on a separate line. Por exemplo, a produção:For example, the production:

dígito-decimal: one ofdecimal-digit: one of
      0 1 2 3 4 5 6 7 8 9      0 1 2 3 4 5 6 7 8 9

é uma versão abreviada de:is shorthand for:

dígito-decimal:decimal-digit:
      0      0
      1      1
      2      2
      3      3
      4      4
      5      5
      6      6
      7      7
      8      8
      9      9

Análise lexicalLexical Analysis

A produção unidade-lexical define a gramática lexical para um documento do M.The lexical-unit production defines the lexical grammar for an M document. Todos os documentos do M válidos estão em conformidade com essa gramática.Every valid M document conforms to this grammar.

unidade-lexical:
      elementos-lexicaisopt
elementos-lexicais:
      elemento-lexical
      elemento-lexical
      elementos-lexicais
elemento-lexical:
      espaço em branco
      token comentário
lexical-unit:
      lexical-elementsopt
lexical-elements:
      lexical-element
      lexical-element
      lexical-elements
lexical-element:
      whitespace
      token comment

No nível lexical, um documento do M consiste em um fluxo de elementos de espaço em branco, comentário e token.At the lexical level, an M document consists of a stream of whitespace, comment, and token elements. Cada uma dessas produções é abordada nas seções a seguir.Each of these productions is covered in the following sections. Somente os elementos token são significativos na gramática sintática.Only token elements are significant in the syntactic grammar.

Espaço em brancoWhitespace

O espaço em branco é usado para separar comentários e tokens em um documento do M.Whitespace is used to separate comments and tokens within an M document. O espaço em branco inclui o caractere de espaço (que faz parte da classe Unicode ZS), bem como a tabulação horizontal e a vertical, o feed de formulário e as sequências de caracteres de nova linha.Whitespace includes the space character (which is part of Unicode class Zs), as well as horizontal and vertical tab, form feed, and newline character sequences. As sequências de caracteres de nova linha incluem retorno de carro, alimentação de linha, retorno de carro seguido de alimentação de linha, linha seguinte e caracteres separadores de parágrafo.Newline character sequences include carriage return, line feed, carriage return followed by line feed, next line, and paragraph separator characters.

espaço em branco:whitespace:
      Qualquer caractere com classe Unicode ZS      Any character with Unicode class Zs
      Caractere de tabulação horizontal (U+0009)      Horizontal tab character (U+0009)
      Caractere de tabulação vertical (U+000B)      Vertical tab character (U+000B)
      Caractere de feed de formulário (U+000C)      Form feed character (U+000C)
      Caractere de retorno de carro (U+000D) seguido pelo caractere de alimentação de linha (U+000A)      Carriage return character (U+000D) followed by line feed character (U+000A)
      caractere-de-nova-linha      new-line-character
caractere-de-nova-linha:new-line-character:
      Caractere de retorno de carro (U+000D)      Carriage return character (U+000D)
      Caractere de feed de linha (U+000A)      Line feed character (U+000A)
      Caractere de próxima linha (U+0085)      Next line character (U+0085)
      Caractere separador de linha (U+2028)      Line separator character (U+2028)
      Caractere separador de parágrafo (U+2029)      Paragraph separator character (U+2029)

Para compatibilidade com ferramentas de edição de código-fonte que adicionam marcadores de final de arquivo e para permitir que um documento seja exibido como uma sequência de linhas encerradas corretamente, as seguintes transformações são aplicadas, em ordem, a um documento do M:For compatibility with source code editing tools that add end-of-file markers, and to enable a document to be viewed as a sequence of properly terminated lines, the following transformations are applied, in order, to an M document:

  • Se o último caractere do documento for um caractere de Controle Z (U+001A), esse caractere será excluído.If the last character of the document is a Control-Z character (U+001A), this character is deleted.

  • Um caractere de retorno de carro (U+000D) será adicionado ao final do documento se esse documento não estiver vazio e se o último caractere do documento não for um retorno de carro (U+000D), uma alimentação de linha (U+000A), um separador de linha (U+2028) nem um separador de parágrafo (U+2029).A carriage-return character (U+000D) is added to the end of the document if that document is non-empty and if the last character of the document is not a carriage return (U+000D), a line feed (U+000A), a line separator (U+2028), or a paragraph separator (U+2029).

ComentáriosComments

Dois formulários de comentários são compatíveis: comentários de linha única e comentários delimitados.Two forms of comments are supported: single-line comments and delimited comments. Os comentários de linha única começam com os caracteres // e se estendem até o final da linha de origem.Single-line comments start with the characters // and extend to the end of the source line. Os comentários delimitados começam com os caracteres /* e terminam com os caracteres */.Delimited comments start with the characters /* and end with the characters */.

Os comentários delimitados podem abranger várias linhas.Delimited comments may span multiple lines.

comentário:
      comentário-de-linha-única
      comentário-delimitado
comentário-de-linha-única:
comment:
      single-line-comment
      delimited-comment
single-line-comment:

      // caracteres-de-comentário-de-linha-únicaopt
caracteres-de-comentário-de-linha-única:
      caracteres-de-comentário-de-linha-única caractere-de-comentário-de-linha-únicaopt
caractere-de-comentário-de-linha-única:
      // single-line-comment-charactersopt
single-line-comment-characters:
      single-line-comment-character single-line-comment-charactersopt
single-line-comment-character:

      Qualquer caractere Unicode, exceto um comentário-delimitado por caractere-de-nova-linha
:
      Any Unicode character except a new-line-character
delimited-comment:

      /* texto-de-comentário-delimitadoopt asteriscos /      /* delimited-comment-textopt asterisks /
texto-de-comentário-delimitado:
      seção-de-comentário-delimitado texto-de-comentário-delimitadoopt
seção-de-comentário-delimitado:
delimited-comment-text:
      delimited-comment-section delimited-comment-textopt
delimited-comment-section:

      /      /
      asteriscosopt caracteres-diferentes-de-barra-e-asterisco
asteriscos:
      asterisksopt not-slash-or-asterisk
asterisks:

      * asteriscosopt
caracteres-diferentes-de-barra-e-asterisco asteriscos:
      * asterisksopt
not-slash-or-asterisk:

      Qualquer caractere Unicode, exceto * ou /      Any Unicode character except * or /

Os comentários não podem ser aninhados.Comments do not nest. As sequências de caracteres /* e */ não têm nenhum significado especial dentro de um comentário de linha única, e as sequências de caracteres // e /* não têm nenhum significado especial dentro de um comentário delimitado.The character sequences /* and */ have no special meaning within a single-line comment, and the character sequences // and /* have no special meaning within a delimited comment.

Os comentários não são processados em literais de texto.Comments are not processed within text literals. O exemploThe example

/* Hello, world 
*/ 
    "Hello, world"

inclui um comentário delimitado.includes a delimited comment.

O exemploThe example

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

mostra vários comentários de linha única.shows several single-line comments.

TokensTokens

Um token é um identificador, uma palavra-chave, um literal, um operador ou um pontuador.A token is an identifier, keyword, literal, operator, or punctuator. O espaço em branco e os comentários são usados para separar tokens, mas não são considerados tokens.Whitespace and comments are used to separate tokens, but are not considered tokens.

token:
      identificador
      palavra-chave
      literal
      operador-ou-pontuador
token:
      identifier
      keyword
      literal
      operator-or-punctuator

Sequências de escape de caractereCharacter Escape Sequences

Os valores de texto do M podem conter caracteres Unicode arbitrários.M text values can contain arbitrary Unicode characters. Os literais de texto, por sua vez, são limitados a caracteres gráficos e exigem o uso de sequências de escape para caracteres não gráficos.Text literals, however, are limited to graphic characters and require the use of escape sequences for non-graphic characters. Por exemplo, para incluir um retorno de carro, avanço de linha ou caractere de tabulação em um literal de texto, é possível usar as sequências de escape #(cr), #(lf) e #(tab), respectivamente.For example, to include a carriage-return, linefeed, or tab character in a text literal, the #(cr), #(lf), and #(tab) escape sequences can be used, respectively. Para inserir os caracteres iniciais de sequência de escape #( em um literal de texto, o # propriamente dito precisa ser escapado:To embed the escapesequence start characters #( in a text literal, the # itself needs to be escaped:

#(#)(

As sequências de escape também podem conter valores curtos (quatro dígitos hexadecimais) ou longos (oito dígitos hexadecimais) de ponto de código Unicode.Escape sequences can also contain short (four hex digits) or long (eight hex digits) Unicode code-point values. Portanto, estas três sequências de escape são equivalentes:The following three escape sequences are therefore equivalent:

#(000D)     // short Unicode hexadecimal value 
#(0000000D) // long Unicode hexadecimal value 
#(cr)       // compact escape shorthand for carriage return

Vários códigos de escape podem ser incluídos em uma única sequência de escape, separados por vírgulas. As seguintes duas sequências são, portanto, equivalentes:Multiple escape codes can be included in a single escape sequence, separated by commas; the following two sequences are thus equivalent:

#(cr,lf) 
#(cr)#(lf)

A descrição a seguir representa o mecanismo padrão de saída de caracteres em um documento do M.The following describes the standard mechanism of character escaping in an M document.

sequência-de-escape-de-caracteres:character-escape-sequence:
      #( lista-de-sequências-de-escape )      #( escape-sequence-list )
lista-de-sequências-de-escape:
      sequência-de-escape-única
      sequência-de-escape-única
, lista-de-sequência-de-escape
sequência-de-escape-única:
      sequência-de-escape-unicode-longa
      sequência-de-escape-unicode-curta
      sequência-de-escape-de-caracteres-de-controle
      escape-escape
sequência-de-escape-unicode-longa:
      dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal
sequência-de-escape-unicode-curta:
      dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal dígito-hexadecimal
sequência-de-escape-de-caracteres-de-controle:
      caractere-de-controle
caractere-de-controle:
escape-sequence-list:
      single-escape-sequence
      single-escape-sequence
, escape-sequence-list
single-escape-sequence:
      long-unicode-escape-sequence
      short-unicode-escape-sequence
      control-character-escape-sequence
      escape-escape
long-unicode-escape-sequence:
      hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit
short-unicode-escape-sequence:
      hex-digit hex-digit hex-digit hex-digit
control-character-escape-sequence:
      control-character
control-character:

      cr      cr
      lf      lf
      tab      tab
escape-escape: escape-escape:
      #      #

LiteraisLiterals

Um literal é uma representação de código-fonte de um valor.A literal is a source code representation of a value.

literal:
      literal-lógico
      literal-de-número
      literal-de-texto
      literal-nulo
      literal-textual
literal:
      logical-literal
      number-literal
      text-literal
      null-literal
      verbatim-literal

Literais nulosNull literals

O literal nulo é usado para escrever o valor de null.The null literal is used to write the null value. O valor de null representa um valor ausente.The null value represents an absent value.

literal-nulo:null-literal:
      null      null

Literais lógicosLogical literals

Um literal lógico é usado para gravar os valores true e false e produz um valor lógico.A logical literal is used to write the values true and false and produces a logical value.

literal-lógico:logical-literal:
      true      true
      false      false

Literais de númeroNumber literals

Um literal de número é usado para escrever um valor de número e produz um valor de número.A number literal is used to write a numeric value and produces a number value.

literal-de-número:
      literal-de-número-decimal
      literal-de-número-hexadecimal
literal-de-número-decimal:
      dígitos-decimais
. dígitos-decimais parte-do-expoenteopt
number-literal:
      decimal-number-literal
      hexadecimal-number-literal
decimal-number-literal:
      decimal-digits
. decimal-digits exponent-partopt

      . dígitos-decimais parte-do-expoenteopt
      dígitos-decimais parte-do-expoenteopt
dígitos-decimais:
      dígito-decimal dígitos-decimaisopt
dígito-decimal:
um de
      . decimal-digits exponent-partopt
      decimal-digits exponent-partopt
decimal-digits:
      decimal-digit decimal-digitsopt
decimal-digit:
one of

      0 1 2 3 4 5 6 7 8 9      0 1 2 3 4 5 6 7 8 9
parte-do-expoente:exponent-part:
      e sinalopt dígitos-decimais      e signopt decimal-digits
      E sinalopt dígitos-decimais
sinal:
one of
      E signopt decimal-digits
sign:
one of

      + -      + -
literal-de-número-hexadecimal:hexadecimal-number-literal:
      0x dígitos-hexadecimais      0x hex-digits
      0X dígitos-hexadecimais
dígitos-hexadecimais:
      dígito-hexadecimal dígitos-hexadecimaisopt
dígito-hexadecimal:
um entre
      0X hex-digits
hex-digits:
      hex-digit hex-digitsopt
hex-digit:
one of

      0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f      0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

Um número pode ser especificado em formato hexadecimal colocando-se os caracteres 0x antes dos dígitos-hexadecimais.A number can be specified in hexadecimal format by preceding the hex-digits with the characters 0x. Por exemplo:For example:

0xff // 255

Observe que, se um ponto decimal for incluído em um número literal, pelo menos um dígito precisará existir depois dele.Note that if a decimal point is included in a number literal, then it must have at least one digit following it. Por exemplo, 1.3 é um número literal, mas 1. e 1.e3 não são.For example, 1.3 is a number literal but 1. and 1.e3 are not.

Literais de textoText literals

Um literal de texto é usado para escrever uma sequência de caracteres Unicode e produz um valor de texto.A text literal is used to write a sequence of Unicode characters and produces a text value.

literal-de-texto:text-literal:
      " caracteres-de-literal-de-textoopt "      " text-literal-charactersopt "
caracteres-de-literal-de-texto:
      caractere-de-literal-de-texto caracteres-de-literal-de-textoopt
caractere-de-literal-de-texto:
      caractere-de-texto-único
      sequência-de-escape-de-caracteres
      sequência-de-escape-com-aspas-duplas
caractere-de-texto-único:
text-literal-characters:
      text-literal-character text-literal-charactersopt
text-literal-character:
      single-text-character
      character-escape-sequence
      double-quote-escape-sequence
single-text-character:

      Qualquer caractere, exceto " (U+0022) ou # (U+0023) seguido por ( (U+0028)      Any character except " (U+0022) or # (U+0023) followed by ( (U+0028)
sequência-de-escape-com-aspas-duplas:double-quote-escape-sequence:
      "" (U+0022, U+0022)      "" (U+0022, U+0022)

Para incluir aspas em um valor de texto, a marca de aspas é repetida, da seguinte maneira:To include quotes in a text value, the quote mark is repeated, as follows:

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

A produção sequência-de-escape-de-caracteres pode ser usada para gravar caracteres em valores de texto sem precisar codificá-los diretamente como caracteres Unicode no documento.The character-escape-sequence production can be used to write characters in text values without having to directly encode them as Unicode characters in the document. Por exemplo, um retorno de carro e uma alimentação de linha podem ser escritos em um valor de texto como:For example, a carriage return and line feed can be written in a text value as:

"Hello world#(cr,lf)"

Literais textuaisVerbatim literals

Um literal textual é usado para armazenar uma sequência de caracteres Unicode que foram inseridos por um usuário como código, mas que não podem ser analisados corretamente como código.A verbatim literal is used to store a sequence of Unicode characters that were entered by a user as code, but which cannot be correctly parsed as code. No tempo de execução, ele produz um valor de erro.At runtime, it produces an error value.

literal-textual:verbatim-literal:
      #!" caracteres-de-literal-de-textoopt "      #!" text-literal-charactersopt "

IdentificadoresIdentifiers

Um identificador é um nome usado para fazer referência a um valor.An identifier is a name used to refer to a value. Os identificadores podem ser identificadores comuns ou identificadores entre aspas.Identifiers can either be regular identifiers or quoted identifiers.

identificador:
      identificador-comum
      identificador-entre-aspas
identificador-comum:
      identificador-disponível
      identificador-disponível caractere-de-ponto identificador-comum
identificador-disponível:
identifier:
      regular-identifier
      quoted-identifier
regular-identifier:
      available-identifier
      available-identifier dot-character regular-identifier
available-identifier:

      Uma palavra-chave-ou-identificador que não é uma palavra-chave
palavra-chave-ou-identificador:
      caractere-inicial-do-identificador caracteres-da-parte-do-identificadoropt
caractere-inicial-do-identificador:
      caractere-de-letra
      caractere-de-sublinhado
caracteres-da-parte-do-identificador:
      caractere-da-parte-do-identificador caracteres-da-parte-do-identificadoropt
caractere-da-parte-do-identificador:
      caractere-de-letra
      caractere-de-dígito-decimal
      caractere-de-sublinhado
      caractere-de-conexão
      caractere-de-combinação
      caractere-de-formatação
caractere-de-ponto:
      A keyword-or-identifier that is not a keyword
keyword-or-identifier:
      identifier-start-character identifier-part-charactersopt
identifier-start-character:
      letter-character
      underscore-character
identifier-part-characters:
      identifier-part-character identifier-part-charactersopt
identifier-part-character:
      letter-character
      decimal-digit-character
      underscore-character
      connecting-character
      combining-character
      formatting-character
dot-character:

      . (U+002E)      . (U+002E)
caractere-de-sublinhado:underscore-character:
      _ (U+005F)      _ (U+005F)
caractere-de-letra:letter-character:
      Um caractere Unicode de uma das classes Lu, Ll, Lt, Lm, Lo ou Nl      A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
caractere-de-combinação:combining-character:
      Um caractere Unicode de uma das classes Mn ou Mc      A Unicode character of classes Mn or Mc
caractere-de-dígito-decimal:decimal-digit-character:
      Um caractere Unicode da classe Nd      A Unicode character of the class Nd
caractere-de-conexão:connecting-character:
      Um caractere Unicode da classe Pc      A Unicode character of the class Pc
caractere-de-formatação: formatting-character:
      Um caractere Unicode da classe Cf      A Unicode character of the class Cf

Um identificador-entre-aspas pode ser usado para permitir que qualquer sequência de zero ou mais caracteres Unicode seja usada como um identificador, incluindo palavras-chave, espaço em branco, comentários, operadores e pontuadores.A quoted-identifier can be used to allow any sequence of zero or more Unicode characters to be used as an identifier, including keywords, whitespace, comments, operators and punctuators.

identificador-entre-aspas:quoted-identifier:
      #" caracteres-de-literal-de-textoopt "      #" text-literal-charactersopt "

Observe que as sequências de escape e as aspas duplas para as aspas de escape podem ser usadas em um identificador entre aspas, assim como em um literal-de-texto.Note that escape sequences and double-quotes to escape quotes can be used in a quoted identifier, just as in a text-literal.

O seguinte exemplo usa aspas em identificadores naqueles nomes que contêm um caractere de espaço:The following example uses identifier quoting for names containing a space character:

[ 
    #"1998 Sales" = 1000, 
    #"1999 Sales" = 1100, 
    #"Total Sales" = #"1998 Sales" + #"1999 Sales"
]

O seguinte exemplo usa aspas em identificadores a fim de incluir o operador + em um identificador:The following example uses identifier quoting to include the + operator in an identifier:

[ 
    #"A + B" = A + B, 
    A = 1, 
    B = 2 
]

Identificadores generalizadosGeneralized Identifiers

Há dois lugares no M em que nenhuma ambiguidade é introduzida por identificadores que contêm espaços em branco ou que são palavras-chave ou literais de número.There are two places in M where no ambiguities are introduced by identifiers that contain blanks or that are otherwise keywords or number literals. Esses locais são os nomes dos campos de registro em um literal de registro e em um operador de acesso de campo ([ ]). Ali, o M permite o uso desses identificadores sem necessidade de usar de identificadores entre aspas.These places are the names of record fields in a record literal and in a field access operator ([ ]) There, M allows such identifiers without having to use quoted identifiers.

[ 
    Data = [ Base Line = 100, Rate = 1.8 ], 
    Progression = Data[Base Line] * Data[Rate]
]

Os identificadores usados para nomear e acessar campos são chamados de identificadores generalizados e são definidos da seguinte maneira:The identifiers used to name and access fields are referred to as generalized identifiers and defined as follows:

identificador-generalizado:
      parte-do-identificador-generalizado
      identificador-generalizado
separado somente por espaços em branco (U+0020)
generalized-identifier:
      generalized-identifier-part
      generalized-identifier
separated only by blanks (U+0020)

parte-do-identificador-generalizado
parte-do-identificador-generalizado:
      segmento-do-identificador-generalizado
      caractere-de-dígito-decimal segmento-do-identificador-generalizado
segmento-do-identificador-generalizado:
      palavra-chave-ou-identificador
      palavra-chave-ou-identificador caractere-de-ponto palavra-chave-ou-identificador
generalized-identifier-part
generalized-identifier-part:
      generalized-identifier-segment
      decimal-digit-character generalized-identifier-segment
generalized-identifier-segment:
      keyword-or-identifier
      keyword-or-identifier dot-character keyword-or-identifier

Palavras-chaveKeywords

Uma palavra-chave é uma sequência de caracteres semelhante à de um identificador que é reservada e não pode ser usada como um identificador, exceto ao usar o mecanismo de colocação de aspas em identificadores ou nos casos em que um identificador genérico é permitido.A keyword is an identifier-like sequence of characters that is reserved, and cannot be used as an identifier except when using the identifier-quoting mechanism or where a generalized identifier is allowed.

palavra-chave: um entrekeyword: one of
       and as each else error false if in is let meta not null or otherwise       and as each else error false if in is let meta not null or otherwise
       section shared then true try type #binary #date #datetime       section shared then true try type #binary #date #datetime
       #datetimezone #duration #infinity #nan #sections #shared #table #time       #datetimezone #duration #infinity #nan #sections #shared #table #time

Operadores e pontuadoresOperators and punctuators

Há vários tipos de operadores e pontuadores.There are several kinds of operators and punctuators. Os operadores são usados em expressões para descrever as operações que envolvem um ou mais operandos.Operators are used in expressions to describe operations involving one or more operands. Por exemplo, a expressão a + b usa o operador + para adicionar os dois operandos a e b.For example, the expression a + b uses the + operator to add the two operands a and b. Os pontuadores servem para agrupamento e separação.Punctuators are for grouping and separating.

operador-ou-pontuador: um entreoperator-or-punctuator: one of
      , ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? => .. ...      , ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? => .. ...