· Lexical · Modules · Declarations · Types · Properties · Attributes · Pragmas · Expressions · Statements · Arrays · Structs & Unions · Classes · Interfaces · Enums · Functions · Operator Overloading · Templates · Mixins · Contracts · Conditional Compilation · Handling errors · Garbage Collection · Memory Management · Floating Point · Inline Assembler · Documentation Comments · Interfacing To C · Portability Guide · Embedding D in HTML · Named Character Entities · Application Binary Interface |
LéxicoEm D, a análise léxica é independente da análise sintática e da análise semântica. O analisador léxico racha o texto fonte em símbolos. A gramática léxica descreve o que esses símbolos são. A gramática léxica de D é projetada para ser apropriada para exploração em alta velocidade, tem um mínimo de regras especiais, há somente uma fase de tradução, e para tornar fácil fazer um scanner para ela. Os símbolos são prontamente reconhecíveis por aqueles familiares com C e C++.Fases de CompilaçãoO processo de compilar é dividido em múltiplas fases. Nenhuma fase tem dependência da fase anterior. Por exemplo, o scanner não é perturbado pelo analisador semântico. Essa separação de fases faz ferraamenas de linguagem como editores de sintaxe direta relativamente simples para produzir. Também é possível comprimir fonte em D armazenando-a na forma 'tokenizada' (algo tipo forma de símbolos).
Texto fonteTexto onte em D pode estar em um dos seguintes formatos:
Não há digrafos e nem trigrafos em D. O texto fonte consiste de espaços em branco, fins de linhas, comentários, seqüências de símbolos especiais, símbolos, tudo seguido por fim do arquivo. O texto fonte é rachado em
símbolos usando a técnica do munch
máximo, ou seja., o analisador léxico tenta fazer
o maior símbolo possível. Por exemplo Fim do ArquivoFimDoArquivo:O texto fonte é terminado por qual deles vir primeiro. Fim de LinhaFimDeLinha:Não há linha de barra invertida emendando, nem há qualquer limite no comprimento da linha. Espaço em BrancoEspaçoEmBranco:Espaço em branco é definido como uma seqüência de um ou mais espaços, tabulações, tabulações verticais, alimentação de formulário, finais de linha, ou comentários. ComentáriosComentário:D tem três tipos de comentários:
a = /+ // +/ 1; // analisa como 'a = 1;'Comentários não podem ser usados como concatenadores de símbolos, por exemplo, abc/**/def
são dois símbolos, abc e def,
não um símbolo abcdef.
SímbolosSímbolo: IdentificadoresIdentificador:Identificadores começam com uma letra, _, ou universal alpha, e são seguidos por quaisquer letras ou números, _, digitos, ou universal alphas. Universal alphas são definidos em ISO/IEC 9899:1999(E) Apêndice D. (Isso é o Padrão C99.) Identificadores podem ser arbitrariamente longos, e são sencíveis ao caso. Identificadores começando com __ (dois underscores) são reservados. String LiteraisStringLiteral:Uma string literal é ou uma string entre aspas duplas, uma wysiwyg quoted string, uma seqüência de escape, ou uma hex string. Wysiwyg quoted strings são envolvidas por r" e ". Todos os caracteres entre o r" e " são parte da string, exceto para FimDeLinha que é considerado como um único caractere \n. Não há seqüências de escape dentro de r" ": r"hello"Uma forma alternativa de wysiwyg strings são envolvidas por aspas invertida, o caractere `. O caractere ` não está disponível em alguns teclados e a renderização de fonte deles é às vezes indistinguível do caractere '. Já que, porém, o ` é raramente usado, ele é útil para delimitar strings com " nelas. `hello`Strings entre aspas duplas sçao envolvidas por "".Seqüências de escape podem ser embutidas nelas com a tipica notação \. FimDeLinha é considerado como um único caractere \n. "hello"Strings de escape começam com um \ e formam uma seqüência de caracteres de escape. Strings de escape adjacentes são concatenadas: \n o caractere alimentador de linhaSeqüências de escape indefinidas são um erro. Hex strings permitem que strings literais sejam criadas usando dados hex: x"0A" // mesmo que "\x0AEspaços em branco e nova linhas são ignoradas, então os dados hex podem ser facilmente formatados.O número de caracteres hex deve ser um múliplo de 2. Strings adjacentes são concatenadas com o operador ~, ou por simples justaposição: "hello " ~ "world" ~ \n // forma a string 'h','e','l','l','o',' ',O seguinte é equivalente: "ab" "c"O caractere Postfix opcional dá um tipo específico à string, rather than it being inferred from the context. Isso é útil quando o tipo não pode ser unambiguamente inferred, como com bases sobrecarregadas em tipos de string. Os tipos correspondentes dos caracteres pósfixos são:
Caracteres LiteraisCaracterLiteral:Caracteres literaissão um único caractere ou seqüência de escape envolvidos por aspas simples, ' '. Inteiros LiteraisInteiroLiteral:Inteiros podem ser especificados em decimal, binário, octal, ou hexadecimal. Inteirso decimais são uma seqüência de digitos decimais. Inteiros binários são uma seqüência de digitos binários precedidos com um '0b'. Inteiros octais são uma seqüência de digitos octais precedidos com um '0'. Inteiros hexadecimais são uma seqüência de digitos hexadecimais precedidos com um '0x' ou seguidos por um 'h'. Inteiros podemter caracteres '_' embutidos, que são ignorados. O '_' embutido é útil para formatar literais logos, assim como usando eles como um separador de milhares: 123_456 // 123456Inteiros podem ser imediatamente seguidos por um 'l' ou um 'u' ou ambos. O tipo de inteiro é resonvido como segue:
Floating LiteraisFloatLiteral:Floats podem estar no formato decimal ou hexadecimal, como no padrão C. Floats hexadecimais são precedidos com um 0x é um p ou P seguido por um número decimal servindo como o expoente de 2. Floating literais podem ter caracteres '_' embutidos, que são ignorados. O '_' embutido é útil para formatar literais longos para torná-los mais simples de ler, como usando eles como separador de milhares: 123_456.567_8 // 123456.5678Floating literais sem sufixo são do tipo double. Floats podem ser seguidos por um sufixo f, F, l ou L. O sufixo f ou F significa que é um float, e l ou L significa que é um real. Se um floating literal é seguido por i ou I, então ele é um tipo ireal (imaginário). Exemplos: 0x1.FFFFFFFFFFFFFp1023 // double.maxÉ um erro se o literal excede a escala do tipo. Não é um erro se o literal é arredondado para caber nos dígitos significantes do tipo. Literais complexos não são símbolos, mas são montados em expressões reais e imaginárias em uma análise semântica: 4.5 + 6.2i // número complexo
Palavras-chavePalavras-chave são identificadores reservados.PalavraChave: Símbolos EspeciaisEsses símbolos são substituídos por outros símbolos de acordo com a seguinte tabela:
Seqüências de Símbolos EspeciaisSeqüências de símbolos especiais são processadas pelo analisador léxico, podem aparecer entre quaisquer outros símbolos, e não afetam a anásile de sintaxe.Atualmente hpa apenas uma seqüência de símbolos especiais, #line. SequencisSimpolosEspeciaisIsso ajusta o número da linha para Inteiro, e opcionalmente o nome do arquivo fonte para EspecArquivo, começando com a próxima linha do texto fonte. O arquivo fonte e número da linha são usados para imprimir mensagens de erro e mapear código gerado devolta para a fonte para a saída de depuração simbolica. Por Exemplo: int #line 6 "foo\bar"Note que o caractere de barra invertida não é tratado especialmente dentro de strings EspecArquivo. |