Stropping (sintaxe) - Stropping (syntax)

No design de linguagem de computador , stropping é um método de marcar explicitamente sequências de letras como tendo uma propriedade especial, como ser uma palavra - chave ou um certo tipo de variável ou local de armazenamento e, portanto, habitar um namespace diferente dos nomes comuns ("identificadores") , a fim de evitar confrontos. Stropping não é usado na maioria das linguagens modernas - em vez disso, as palavras-chave são palavras reservadas e não podem ser usadas como identificadores. Stropping permite que a mesma sequência de letras seja usada como palavra-chave e como identificador , e simplifica a análise nesse caso - por exemplo, permitindo uma variável nomeada ifsem entrar em conflito com a palavra-chave if .

O stropping está principalmente associado ao ALGOL e linguagens relacionadas na década de 1960. Embora encontre algum uso moderno , é facilmente confundido com outras técnicas semelhantes que são superficialmente semelhantes.

História

O método de stropping e o termo "stropping" surgiram no desenvolvimento do ALGOL na década de 1960, onde era usado para representar distinções tipográficas (negrito e sublinhado) encontradas na linguagem de publicação que não podiam ser representadas diretamente na linguagem de hardware - a A máquina de escrever podia ter caracteres em negrito, mas na codificação em cartões perfurados não havia caracteres em negrito. O termo "stropping" surgiu no ALGOL 60 , de " apóstrofo ", pois algumas implementações do ALGOL 60 usavam apóstrofos em torno do texto para indicar negrito, como 'if'para representar a palavra-chave if . O stropping também é importante no ALGOL 68 , onde vários métodos de stropping, conhecidos como "regimes de stropping", são usados; os apóstrofos correspondentes originais do ALGOL 60 não foram amplamente usados, com um ponto inicial ou maiúscula sendo mais comum, como em .IFou IFe o termo "stropping" foi aplicado a todos eles.

Sintaxes

Uma gama de sintaxes diferentes para stropping foi usada:

  • Algol 60 comumente usado apenas a convenção de aspas simples em torno da palavra, geralmente como apóstrofos, de onde vem o nome "stropping" (por exemplo 'BEGIN').
  • Algol 68 em algumas implementações trata sequências de letras prefixadas por uma aspa simples, ', como sendo palavras-chave (por exemplo, 'BEGIN)

Na verdade, era comum que várias convenções de redução pudessem ser usadas em um idioma. Por exemplo, no ALGOL 68 , a escolha da convenção de stropping pode ser especificada por uma diretiva do compilador (na terminologia ALGOL, um " pragmat "), a saber POINT, UPPER, QUOTE ou RES:

  • PONTO para 6 bits (caracteres insuficientes para minúsculas), como em .FOR- uma convenção semelhante é usada em FORTRAN 77, onde palavras-chave LÓGICAS são eliminadas como .EQ.etc. (veja abaixo)
  • MAIÚSCULAS para 7 bits, como em FOR- com letras minúsculas usadas para identificadores comuns
  • QUOTE como em ALGOL 60, como em 'for'
  • Palavras reservadas RES, como usadas em linguagens modernas - forsão reservadas e não estão disponíveis para identificadores comuns

Os vários regimes de regras são uma especificação lexical para caracteres stropped, embora em alguns casos estes tenham interpretações simples: nos regimes de apóstrofo e ponto único, o primeiro caractere funciona como um caractere de escape , enquanto no regime de apóstrofos correspondentes os apóstrofos funcionam como delimitadores , como em literais de string .

Outros exemplos:

  • O Atlas Autocode tinha a escolha de três: palavras-chave podem estar underlinedusando backspace e overstrike em um teclado Flexowriter , podem ser introduzidas por um %percent %symbolou podem ser digitadas UPPER CASEsem nenhum caractere delimitador (modo "limitadores maiúsculos", caso em que todas as variáveis ​​devem estar em minúsculas).
  • Algol 60 nos computadores Elliott 803 e Elliott 503 usado sublinhado. Os Flexowriters (produzindo fita de papel perfurada) tinham uma tecla sem movimento (sublinhado _) para que a digitação _b_e_g_i_n produzida fosse iniciada, o que era muito legível. A barra vertical | também era uma tecla sem movimento, de modo que digitar | = produziu uma boa aproximação de ≠.
  • Os programas ALGOL 68RS podem usar várias variantes de stropping, mesmo dentro de um processador de linguagem.
  • Edinburgh IMP herdou a %percent %symbolconvenção de prefixo Atlas Autocode, mas não suas outras opções de stropping

Exemplos de diferentes estilos ALGOL 68

Observe a diretiva principal pr (abreviação de pragmat ) , que é ela própria delimitada no estilo POINT ou quote, e o for comment (de " ") - consulte ALGOL 68: pr & co: Pragmats and Comments para obter detalhes. ¢

Algol68 "estrito"
como normalmente publicado
Corte de citações
(como wikitexto )
Para um compilador de código de caracteres de 7 bits
Para um compilador de código de caracteres de 6 bits
Algol68 usando res stropping
(palavra reservada)
¢ sublinhado ou
   fonte em negrito ¢
 modo  xint = int ;
 xint soma sq: = 0;
 por mim enquanto
   soma sq ≠ 70 × 70
 Faz
   soma sq +: = i ↑ 2
 od
'pr' quote 'pr'
'mode' 'xint' = 'int';
'xint' sum sq:=0;
'for' i 'while'
  sum sq≠70×70
'do'
  sum sq+:=i↑2
'od'
.PR UPPER .PR
MODE XINT = INT;
XINT sum sq:=0;
FOR i WHILE
  sum sq/=70*70
DO
  sum sq+:=i**2
OD
.PR POINT .PR
.MODE .XINT = .INT;
.XINT SUM SQ:=0;
.FOR I .WHILE
  SUM SQ .NE 70*70
.DO
  SUM SQ .PLUSAB I .UP 2
.OD
.PR RES .PR
mode .xint = int;
.xint sum sq:=0;
for i while
  sum sq≠70×70
do
  sum sq+:=i↑2
od

Outras línguas

Por várias razões Fortran 77 tem esses valores "lógicas" e operadores: .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., .AND.,.NOT.

.AND., .OR.e .XOR.também são usados ​​em testes combinados em instruções IFe IFFem arquivos em lote executados nos processadores de linha de comando da JP Software , como 4DOS , 4OS2 e 4NT / Take Command .

Uso moderno

A maioria das linguagens de computador modernas não usa stropping, com duas exceções notáveis:

O uso de várias linguagens na infraestrutura de linguagem comum (CLI) da Microsoft .NET requer uma maneira de usar variáveis ​​em uma linguagem diferente que podem ser palavras-chave em uma linguagem de chamada. Isso às vezes é feito por prefixos, como em C #, ou colocando o identificador entre colchetes, no Visual Basic.NET . @

Um segundo exemplo importante está em muitas implementações de Structured Query Language . Nesses idiomas, as palavras reservadas podem ser usadas como nomes de coluna, tabela ou variável, delimitando-as lexicamente. O padrão especifica palavras reservadas entre aspas duplas, mas na prática o mecanismo exato varia de acordo com a implementação; O MySQL , por exemplo, permite que palavras reservadas sejam usadas em outros contextos, colocando-as entre crases, e o Microsoft SQL Server usa colchetes.

Stropping também pode ser usado na linguagem de programação Nim . No Nim, uma palavra reservada pode ser usada como um identificador, colocando-a entre crases.

Existem outros exemplos menores. Por exemplo, o Web IDL usa um sublinhado inicial _para eliminar identificadores que, de outra forma, colidem com palavras reservadas: o valor do identificador elimina esse sublinhado inicial, tornando-o destacado, em vez de uma convenção de nomenclatura.

Descompactando pelo compilador

Em um front-end de compilador , o unstropping ocorria originalmente durante uma fase inicial de reconstrução da linha , que também eliminava os espaços em branco. Isso foi seguido por análise sem scanner (sem tokenização); isso era padrão na década de 1960, principalmente para ALGOL. No uso moderno, o unstropping é geralmente feito como parte da análise lexical . Isso fica claro se alguém distinguir o lexer em duas fases de scanner e avaliador: o scanner categoriza a sequência fragmentada na categoria correta e, em seguida, o avaliador desmonta ao calcular o valor. Por exemplo, em uma linguagem em que um sublinhado inicial é usado para separar identificadores para evitar colisões com palavras reservadas, a sequência _ifseria categorizada como um identificador (não como a palavra reservada if) pelo scanner e, em seguida, o avaliador forneceria o valor if, resultando (Identifier, if)no tipo e valor do token.

Técnicas semelhantes

Existem várias técnicas semelhantes, geralmente prefixando ou sufixando um identificador para indicar um tratamento diferente, mas a semântica é variada. Estritamente falando, stropping consiste em diferentes representações do mesmo nome (valor) em diferentes namespaces e ocorre no estágio de tokenização. Por exemplo, em ALGOL 60 com stropping apóstrofo correspondente, 'if'é tokenizado como ( palavra- chave, se), enquanto ifé tokenizado como (identificador, se) - mesmo valor em classes de token diferentes.

Usar letras maiúsculas para palavras-chave continua em uso como uma convenção para escrever gramáticas para lexing e análise - tokenizando a palavra reservada ifcomo a classe de token IF e, em seguida, representando uma cláusula if-then-else pela frase em IF Expression THEN Statement ELSE Statementque os termos em maiúsculas são palavras-chave e os termos em maiúsculas são símbolos não terminais em uma regra de produção ( símbolos terminais são denotados por termos em minúsculas, como identifierou integer, para um literal inteiro ).

Convenções de nomenclatura

Mais vagamente, pode-se usar convenções de nomenclatura para evitar conflitos, comumente prefixando ou sufixando com um sublinhado, como em if_ou _then. Um sublinhado inicial é freqüentemente usado para indicar membros privados na programação orientada a objetos.

Esses nomes podem ser interpretados pelo compilador e ter algum efeito, embora isso geralmente seja feito na fase de análise semântica, não na fase de tokenização. Por exemplo, em Python, um único sublinhado inicial é um indicador privado fraco e afeta quais identificadores são importados na importação do módulo, enquanto um sublinhado inicial duplo (e não mais do que um sublinhado final) em um atributo de classe invoca mutação de nome .

Palavras reservadas

Embora as linguagens modernas geralmente usem palavras reservadas em vez de se esforçar para distinguir palavras-chave de identificadores - por exemplo, tornando ifreservado -, também frequentemente reservam uma classe sintática de identificadores como palavras-chave, produzindo representações que podem ser interpretadas como um regime de redução, mas em vez disso têm a semântica de Palavras reservadas.

Isso é mais notável em C, onde os identificadores que começam com um sublinhado são reservados, embora os detalhes precisos de quais identificadores são reservados em que escopo estão envolvidos, e os sublinhados duplos iniciais são reservados para qualquer uso; da mesma forma, em C ++, qualquer identificador que contenha um sublinhado duplo é reservado para qualquer uso, enquanto um identificador que começa com um sublinhado é reservado no espaço global. Assim, pode-se adicionar uma nova palavra-chave foousando a palavra reservada __foo. Embora isso seja superficialmente semelhante ao stropping, a semântica é diferente. Como uma palavra reservada, a string __foorepresenta o identificador __foono namespace do identificador comum. Em stropping (prefixando palavras-chave por __), a string __foorepresenta a palavra-chave fooem um namespace de palavra-chave separado. Assim, usando palavras reservadas, os tokens para __fooe foosão (identificador, __foo) e (identificador, foo) - valores diferentes na mesma categoria - ao separar os tokens para __fooe foosão (palavra-chave, foo) e (identificador, foo) - mesmo valores em diferentes categorias. Eles resolvem o mesmo problema de conflitos de espaço de nomes de uma maneira que é a mesma para um programador, mas que difere em termos de gramática formal e implementação.

Nome mutilado

A mutilação de nomes também aborda conflitos de nomes renomeando identificadores, mas faz isso muito mais tarde na compilação, durante a análise semântica, não durante a tokenização. Isso consiste em criar nomes que incluem informações de escopo e tipo, principalmente para uso por linkers, tanto para evitar conflitos quanto para incluir informações semânticas necessárias no próprio nome. Nestes casos os identificadores originais podem ser idênticos, mas o contexto é diferente, como nas funções foo(int x)versus foo(char x), em ambos os casos tendo o mesmo identificador foo, mas assinatura diferente. Esses nomes podem ser mutilados foo_ie foo_c, por exemplo, incluir as informações de tipo.

Sigilos

Um fenômeno sintaticamente semelhante, mas semanticamente diferente, são sigilos , que em vez disso indicam propriedades de variáveis. Eles são comuns em Perl , Ruby e várias outras linguagens para identificar características de variáveis ​​/ constantes: Perl para designar o tipo de variável, Ruby para distinguir variáveis ​​de constantes e para indicar o escopo. Observe que isso afeta a semântica da variável, não a sintaxe se é um identificador ou palavra-chave.

Paralelos na linguagem humana

Stropping é usado em linguagens de programação de computador para tornar o trabalho do compilador (ou mais estritamente, do analisador ) mais fácil, ou seja, dentro da capacidade dos computadores relativamente pequenos e lentos disponíveis nos primeiros dias da computação no século XX. No entanto, técnicas semelhantes têm sido comumente usadas para auxiliar a compreensão da leitura para as pessoas também. Alguns exemplos são:

  • Colocar palavras importantes em negrito , como a primeira menção de stropping no cabeçalho desta página, porque definir stropping é o propósito da página.
  • Formatar novas palavras em itálico quando são introduzidas no texto pela primeira vez. Isso é comumente usado em ficção científica e fantasia ao introduzir plantas, alimentos e criaturas inventadas; em travelogue e escrita histórica ao descrever palavras estrangeiras desconhecidas; e assim por diante. Também usando uma fonte especial, possivelmente associada ao idioma em questão, por exemplo, usando uma fonte gótica para palavras alemãs .
  • Usar um idioma diferente, normalmente latim ou grego para significar termos técnicos. Isso é semelhante ao uso de palavras reservadas, mas geralmente é combinado com texto em itálico para facilitar a leitura. Por exemplo:
  • Em japonês escrito , além dos caracteres Kanji , os dois alfabetos distintos (mais estritamente, silabários ) Hiragana e Katakana , ambos representando o mesmo conjunto de sons, são usados ​​para distinguir palavras japonesas com grafia fonética de palavras estrangeiras importadas, respectivamente; Katakana também é usado para dar ênfase, assim como o itálico em inglês.

Veja também

Notas

Referências

Leitura adicional