www.digitalmars.com Home | Search | D | Comments
Last update Sat Feb 25 11:48:33 2006
D
Language
Phobos
Comparisons

· 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éxico

Em 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ção

O 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).
  1. conjunto de caracteres fonte
    O arquivo fonte é checado para ver de que conjunto de caracteres ele é, e o scanner apropriado é carregado. Os formatos ASCII e UTF são aceitos.
  2. análise léxica
    O arquivo fonte é dividido em uma seqüência de símbolos. Símbolos especiais são substituídos por outros símbolos. Seqüências de símbolos especiais são processadas e removidas.
  3. análise de sintaxe
    A seqüência de símbolos é analisada para formar árvores de sintaxe.
  4. análise semântica
    As árvores de sintaxe são percorridas para declarar variáveis, carregar tabelas de símbolos, atribuir tipos, e em geral determinar o significado do programa.
  5. otimização
    Otimização é um passo opcional que tenta reescrever o programa em uma versão equivalente em semântica, mas mais rápido para executar.
  6. geração de código
    Instruções são selecionadas da arquitetura alvo para implementar a semântica do programa. O resultado típico será um arquivo objeto, aceitável para a entrada em um linker.

Texto fonte

Texto onte em D pode estar em um dos seguintes formatos:
  • ASCII
  • UTF-8
  • UTF-16BE
  • UTF-16LE
  • UTF-32BE
  • UTF-32LE
UTF-8 é um superconjunto do tradicional ASCII de 7 bits. Uma das seguintes UTF BOMs (Byte Order Marks) pode estar presente no começo do texto fonte:

Formato BOM
UTF-8 EF BB BF
UTF-16BE FE FF
UTF-16LE FF FE
UTF-32BE 00 00 FE FF
UTF-32LE FF FE 00 00
ASCII no BOM

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 >> é um símbolo de deslocamento para direita, não dois símbolos de maior.

Fim do Arquivo

FimDoArquivo:
fim do arquivo físico
\u0000
\u001A
O texto fonte é terminado por qual deles vir primeiro.

Fim de Linha

FimDeLinha:
\u000D
\u000A
\u000D \u000A
FimDeLinha
Não há linha de barra invertida emendando, nem há qualquer limite no comprimento da linha.

Espaço em Branco

EspaçoEmBranco:
Espaço
Espaço EspaçoEmBranco
Espaço:
\u0020
\u0009
\u000B
\u000C
FimDeLinha
Comentário
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ários

Comentário:
/* Caracteres */
// Caracteres FimDeLinha
/+ Caracteres +/
D tem três tipos de comentários:
  1. Comentátios de bloco podem medir múltiplas linhas, mas não se aninham.
  2. Comentários de linha terminam no fim da linha.
  3. Comentários aninhados podem medir múltiplaslinhas e podem aninhar.
Processamento de comentários conceitualmente acontece antas da "simbolização". Isso significa que strings embutidas e comentários não impedem o reconhecimento de aberturas e fechamentos de comentários:
a = /+ // +/ 1; // analisa como 'a = 1;'
a = /+ "+/" +/ 1"; // analisa como 'a = " +/ 1";'
a = /+ /* +/ */ 3; // analisa como 'a = */ 3;'
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ímbolos

Símbolo:
Identificador
StringLiteral
CaractereLiteral
InteiroLiteral
FloatLiteral
PalavraChave
/
/=
.
..
...
&
&=
&&
|
|=
||
-
-=
--
+
+=
++
<
<=
<<
<<=
<>
<>=
>
>=
>>=
>>>=
>>
>>>
!
!=
!==
!<>
!<>=
!<
!<=
!>
!>=
(
)
[
]
{
}
?
,
;
:
$
=
==
===
*
*=
%
%=
^
^=
~
~=

Identificadores

Identificador:
InicioIdentificador
InicioIdentificador CaracteresIdentificador
CaracteresIdentificador:
CaracteresIdentificador
CaracteresIdentificador CaracteresIdentificador
InicioIdentificador:
_
Letra
UniversalAlpha
CaractereIdentificador:
InicioIdentificador
Digito
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 Literais

StringLiteral:
WysiwygString
AlternateWysiwygString
DoubleQuotedString
SequenciaEscape
HexString
WysiwygString:
r" WysiwygCharacters " Postfixopt
AlternateWysiwygString:
` WysiwygCharacters ` Postfixopt
WysiwygCharacter:
Caracter
FimDeLinha
DoubleQuotedString:
" DoubleQuotedCharacters " Postfixopt
DoubleQuotedCharacter:
Caracter
SequenciaEscape
FimDeLinha
SequenciaEscape:
\'
\"
\?
\\
\a
\b
\f
\n
\r
\t
\v
\ FimDeLinha
\x HexDigit HexDigit
\ OctalDigit
\ OctalDigit OctalDigit
\ OctalDigit OctalDigit OctalDigit
\u HexDigit HexDigit HexDigit HexDigit
\U HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit
\& NamedCharacterEntity ;
HexString:
x" HexStringChars " Postfixopt
HexStringChar
HexDigit
EspaçoEmBranco
FimDeLinha
Postfix
c
w
d
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"
r"c:\root\foo.exe"
r"ab\n" // string de 4 caracteres, 'a', 'b', '\', 'n'
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`
`c:\root\foo.exe`
`ab\n` // string de 4 caracteres, 'a', 'b', '\', 'n'
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"
"c:\\root\\foo.exe"
"ab\n" // string de 3 caracteres, 'a', 'b', e um alimentador de linha
"ab
"
// string de 3 caracteres, 'a', 'b', e alimentador de linha
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 linha
\t a caractere de tabulação
\" o caractere de aspas duplas
\012 octal
\x1A hex
\u1234 caractere wchar
\U00101234 caractere dchar
\&reg; caractere ® dchar
\r\n retorno de carro, alimentador de linha
Seqüências de escape indefinidas são um erro.

Hex strings permitem que strings literais sejam criadas usando dados hex:

x"0A" // mesmo que "\x0A
x"00 FBCD 32FD 0A" // mesmo que "\x00\xFB\xCD\x32\xFD\x0A"
Espaç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',' ',
// 'w','o','r','l','d',alimentador de linha
O seguinte é equivalente:
"ab" "c"
r"ab" r"c"
r"a" "bc"
"a" ~ "b" ~ "c"
\x61"bc"
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:

Postfix Tipo
c char[ ]
w wchar[ ]
d dchar[ ]

Caracteres Literais

CaracterLiteral:
' SingleQuotedCharacter '
SingleQuotedCharacter
Caracter
SequenciaEscape
Caracteres literaissão um único caractere ou seqüência de escape envolvidos por aspas simples, ' '.

Inteiros Literais

InteiroLiteral:
Inteiro
Inteiro InteiroSuffix
Inteiro:
Decimal
Binario
Octal
Hexadecimal
Inteiro _
InteiroSuffix:
l
L
u
U
lu
Lu
lU
LU
ul
uL
Ul
UL
Decimal:
0
DigitoNaoZero
DigitoNaoZero Decimal
DigitoNaoZero _ Decimal
Binario:
0b DigitosBinarios
0B DigitosBinarios
Octal:
0 DigitosOctais
Hexadecimal:
0x DigitosHex
0X DigitosHex
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 // 123456
1_2_3_4_5_6_ // 123456
Inteiros podem ser imediatamente seguidos por um 'l' ou um 'u' ou ambos.

O tipo de inteiro é resonvido como segue:

Decimal Literal Tipo
0 .. 2147483647 int
2147483648 .. 9223372036854775807 long
Decimal Literal, Sufixo L Tipo
0L .. 9223372036854775807L long
Decimal Literal, Sufixo U Tipo
0U .. 4294967295U uint
4294967296U .. 18446744073709551615U ulong
Decimal Literal, Sufixo UL Tipo
0UL .. 18446744073709551615UL ulong
Literal Não-Decimal Tipo
0x0 .. 0x7FFFFFFF int
0x80000000 .. 0xFFFFFFFF uint
0x100000000 .. 0x7FFFFFFFFFFFFFFF long
0x8000000000000000 .. 0xFFFFFFFFFFFFFFFF ulong
Literal Não-Decimal, Sufixo L Tipo
0x0L .. 0x7FFFFFFFFFFFFFFFL long
0x8000000000000000L .. 0xFFFFFFFFFFFFFFFFL ulong
Literal Não-Decimal, Sufixo U Tipo
0x0U .. 0xFFFFFFFFU uint
0x100000000UL .. 0xFFFFFFFFFFFFFFFFUL ulong
Literal Não-Decimal, Sufixo UL Tipo
0x0UL .. 0xFFFFFFFFFFFFFFFFUL ulong

Floating Literais

FloatLiteral:
Float
Float FloatSuffix
Float ImaginarySuffix
Float FloatSuffix ImaginarySuffix
Float:
DecimalFloat
HexFloat
Float _
FloatSuffix:
f
F
l
L
ImaginarySuffix:
i
I
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.5678
1_2_3_4_5_6_._5_6_7_8 // 123456.5678
1_2_3_4_5_6_._5e-6_ // 123456.5e-6
Floating 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
0x1p-52 // double.epsilon
1.175494351e-38F // float.min
6.3i // idouble 6.3
6.3fi // ifloat 6.3
6.3LI // ireal 6.3
É 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-chave

Palavras-chave são identificadores reservados.
PalavraChave:
abstract
alias
align
asm
assert
auto
bit
body
break
byte
case
cast
catch
cdouble
cent
cfloat
char
class
const
continue
creal
dchar
debug
default
delegate
delete
deprecated
do
double
else
enum
export
extern
false
final
finally
float
for
foreach
function
goto
idouble
if
ifloat
import
in
inout
int
interface
invariant
ireal
is
long
mixin
module
new
null
out
override
package
pragma
private
protected
public
real
return
short
static
struct
super
switch
synchronized
template
this
throw
true
try
typedef
typeid
typeof
ubyte
ucent
uint
ulong
union
unittest
ushort
version
void
volatile
wchar
while
with

Símbolos Especiais

Esses símbolos são substituídos por outros símbolos de acordo com a seguinte tabela:

Símbolo Especial Substituído por...
__FILE__ string literal contendo o nome do arquivo fonte
__LINE__ inteiro literal da linha atual
__DATE__ string literal da data de compilação "mmm dd yyyy"
__TIME__ string literal do tempo de compilação "hh:mm:ss"
__TIMESTAMP__ string literal da data e tempo de compilação "www mmm dd hh:mm:ss yyyy"

Seqüências de Símbolos Especiais

Seqüê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.

SequencisSimpolosEspeciais
# line Inteiro FimDeLinha
# line Inteiro EspecArquivo FimDeLinha
EspecArquivo
" Caracteres "
Isso 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"
x; // essa é agora a linha 6 do arquivo foo\bar
Note que o caractere de barra invertida não é tratado especialmente dentro de strings EspecArquivo.