2 pontos por GN⁺ 2024-11-03 | 1 comentários | Compartilhar no WhatsApp

A estranha sintaxe lexical

  • Neste mês, aprendi 42 linguagens de programação para criar um novo realçador de sintaxe para o llamafile. Aproveitando o Halloween, quero compartilhar as sintaxes mais surpreendentes.
  • As linguagens suportadas são Ada, Assembly, BASIC, C, C#, C++, COBOL, CSS, D, FORTH, FORTRAN, Go, Haskell, HTML, Java, JavaScript, Julia, JSON, Kotlin, ld, LISP, Lua, m4, Make, Markdown, MATLAB, Pascal, Perl, PHP, Python, R, Ruby, Rust, Scala, Shell, SQL, Swift, Tcl, TeX, TXT, TypeScript e Zig.

Como programar um realçador de sintaxe

  • Implementar um realçador de sintaxe não é difícil. C++ e GNU gperf são ferramentas úteis.
  • O gperf pode gerar uma tabela de hash perfeita para maximizar o desempenho.
  • Um realçador de sintaxe básico pode ser implementado como uma máquina de estados finitos, com foco em strings, comentários e palavras-chave.

Demo

  • O novo realçador de sintaxe do llamafile tem uma vantagem poderosa sobre o ollama.
  • Há uma demonstração de geração de código em várias linguagens de programação usando o modelo Meta LLaMA 3.2 3B Instruct no Windows 10.

Exemplos surpreendentes de sintaxe lexical

  • C: a linguagem C afirma ser simples, mas tem elementos complexos como trigraphs.
  • Haskell: permite comentários aninhados.
  • Tcl: pode incluir aspas em identificadores.
  • JavaScript: tem sintaxe de expressões regulares e usa caracteres UNICODE como quebra de linha.
  • Shell: a sintaxe de heredoc pode ser usada de várias maneiras.
  • String Interpolation: Kotlin, Scala e TypeScript permitem inserir código dentro de strings.
  • Swift: pode cercar strings com vários #.
  • C#: pode delimitar strings usando várias aspas.
  • FORTH: tokeniza tudo com base em limites de espaço em branco.
  • FORTRAN e COBOL: o llamafile oferece suporte a realce de sintaxe para essas linguagens.
  • Zig: inicia strings multilinha com duas barras invertidas.
  • Lua: usa colchetes e sinais de igual em strings multilinha.
  • Assembly: tem vários dialetos, o que dificulta o realce de sintaxe.
  • Ada: usa aspas simples para várias finalidades.
  • BASIC: não exige aspas no final da string.
  • Perl: a sintaxe de expressões regulares é única.
  • Ruby: a sintaxe é complexa e difícil de entender.

Complexidade das linguagens suportadas

  • FORTH é a linguagem mais simples, e Ruby é a mais complexa.
  • A complexidade é avaliada pelo número de linhas de código para o realce de sintaxe de cada linguagem.

Resumo do GN⁺

  • Este artigo explora as sintaxes únicas de várias linguagens de programação e oferece insights necessários para implementar um realçador de sintaxe.
  • O realçador de sintaxe do llamafile oferece suporte a várias linguagens e pode ser especialmente útil na manutenção de linguagens antigas.
  • Ajuda a entender a complexidade sintática das linguagens de programação e será útil para quem tem interesse em desenvolver realçadores de sintaxe.
  • Projetos com funcionalidades semelhantes incluem Pygments e Emacs.

1 comentários

 
GN⁺ 2024-11-03
Comentários do Hacker News
  • Várias linguagens oferecem suporte à inserção de código dentro de strings
    • Incluindo C#, Python, JavaScript, Ruby, Shell e Make
  • Explicação das características únicas da linguagem Tcl
    • É difícil distinguir entre código e dados
    • Comentários podem ser interpretados como código
  • Explicação do prático recurso de strings com citação por dólar do PostgreSQL
    • É possível representar strings de várias formas
  • Explicação do recurso de destaque de sintaxe do Vim
    • O destaque de sintaxe é implementado declarando correspondências e regiões
    • Dá suporte a destaque de sintaxe complexo
  • Explicação do lexer sensível ao contexto da linguagem C
    • É necessária uma tabela de símbolos
    • Para destaque de sintaxe, pode ser necessário fazer a análise sintática completa e usar informações da tabela de símbolos
  • Explicação de um exemplo curioso dos trigraphs de C
    • Explicação da regra de curto-circuito usando o operador lógico ||
  • Explicação da visão do Lisp sobre sintaxe
    • Sintaxe não é uma parte importante da linguagem e deve ser simples e uniforme
  • Opinião de que a sintaxe de Ruby é difícil de entender
  • Os escapes Unicode do Java podem quebrar o destaque de sintaxe
    • Escapes Unicode podem ser usados também fora de strings
  • Interesse na implementação de destaque de sintaxe do Joe
    • É possível destacar adequadamente f-strings do Python
  • Explicação de por que o destaque de sintaxe do TeX é difícil
    • O TeX pode redefinir a função de cada caractere
    • O destaque de sintaxe completo é impossível