Skip to main content

🚀 Trilha Básica

Bem-vindo(a) à Trilha de Desenvolvimento com DSLs com Langium! Esta trilha foi cuidadosamente estruturada para oferecer um caminho completo de aprendizado, desde os conceitos básicos de DSLs (Domain-Specific Languages).

Além do conhecimento técnico, você aprenderá a criar sua própria DSL de forma eficiente, garantindo sintaxe expressiva, validações robustas e ferramentas modernas para facilitar o desenvolvimento.

🔎 O que você vai aprender?
Configuração do ambiente e estrutura de um projeto Langium

Carga horária total: 10h
📌 Formato: Vídeos, artigos, leituras complementares e desafios práticos

🎯 Pré-requisitos
Para um melhor aproveitamento da trilha, é recomendado possuir conhecimentos básicos de:

Tutoriais em Vídeo

Para obter orientação prática sobre o desenvolvimento com Langium, confira esta playlist de tutoriais em vídeo da TypeFox, que aborda os fundamentos do Langium e exemplos úteis:

1. Pré-requisitos

Certifique-se de ter os seguintes itens instalados:

  • Node.js (a versão LTS mais recente é recomendada)
  • npm (incluído com o Node.js)
  • Ubuntu 22.4

2. Instalando o Yeoman e o Gerador Langium

Para configurar o ambiente, instale globalmente o Yeoman e o gerador Langium com o seguinte comando:

npm install -g yo @langium/generator

Este comando instala tanto o Yeoman quanto o gerador específico do Langium, permitindo que você crie projetos Langium de forma rápida e eficiente.

3. Gerando um Projeto Langium

Após a instalação, você pode criar um novo projeto Langium com o seguinte comando:

yo langium

4. Configuração do Projeto

Ao executar este comando, o Yeoman solicitará algumas preferências do projeto. As principais opções de configuração incluem:


> yo langium
┌─────┐ ─┐
┌───┐ │ ╶─╮ ┌─╮ ╭─╮ ╷ ╷ ╷ ┌─┬─╮
│ ,´ │ ╭─┤ │ │ │ │ │ │ │ │ │ │
│╱ ╰─ ╰─┘ ╵ ╵ ╰─┤ ╵ ╰─╯ ╵ ╵ ╵
` ╶─╯

Welcome to Langium! This tool generates a VS Code extension with a "Hello World" language
to get started quickly. The extension name is an identifier used in the extension
marketplace or package registry.
❓ Your extension name: hello-world
The language name is used to identify your language in VS Code. Please provide a name to
be shown in the UI. CamelCase and kebab-case variants will be created and used in
different parts of the extension and language server.
❓ Your language name: Hello World
Source files of your language are identified by their file name extension. You can
specify multiple file extensions separated by commas.
❓ File extensions: .hello
Your language can be run inside of a VSCode extension.
❓ Include VSCode extension? Yes
You can add CLI to your language.
❓ Include CLI? Yes
You can run the language server in your web browser.
❓ Include Web worker? No
You can add the setup for language tests using Vitest.
❓ Include language tests? Yes
  • Your language name: define qual o nome da linguagem que irá criar.
  • File extensions: define qual a extensão da sua linguagem.
  • Include VSCode extension?: define se será gerado uma extensão do VScode.
  • Include CLI?: define se será gerado um CLI para o projeto.
  • Include Web worker?: define se será criado uma versão web da linguagem. Para o nosso exemplo, colocamos não.
  • Include language tests?: define se será gerado classes de teste para a linguagem criada.

5. Estrutura do Projeto

Após a geração, seu projeto terá uma estrutura semelhante a esta:

├── HelloWorld
│   ├── esbuild.mjs
│   ├── langium-config.json
│   ├── langium-quickstart.md
│   ├── language-configuration.json
│   ├── package-lock.json
│   ├── package.json
│   ├── src
│   │ ├── cli
│   │   │   ├── cli-util.js
│  │  │   ├── generator.js
│  │  │   └── main.js
│   │   ├── extension
│   │   │   └── main.ts
│   │   └── language
│   │   ├── generated
│   │   │   ├── ast.ts
│   │   │   ├── grammar.ts
│   │   │   └── module.ts
│   │   ├── hello-world-module.ts
│   │   ├── hello-world-validator.ts
│   │   ├── hello-world.langium
│   │   └── main.ts
│   ├── syntaxes
│   │   └── hello-world.tmLanguage.json
│   └── tsconfig.json
ArquivoDescrição
esbuild.mjsConfiguração do esbuild, ferramenta de bundling e transpile dos arquivos TypeScript para JavaScript. Usado na build do projeto.
langium-config.jsonConfiguração do Langium, define o caminho dos arquivos de entrada e saída, além das regras da gramática.
langium-quickstart.mdDocumentação de início rápido para o projeto gerado, explicando como usar e estender.
language-configuration.jsonConfigurações adicionais da linguagem, como comentários, brackets e auto fechamento de pares.
package-lock.jsonRegistro das versões exatas das dependências instaladas, garantindo builds reproduzíveis.
package.jsonGerenciador de dependências e scripts do projeto Node.js. Contém metadados, dependências e comandos úteis como build, start, etc.
tsconfig.jsonConfiguração do compilador TypeScript, definindo como os arquivos serão transpilados para JavaScript.

📂 src/ — Código fonte principal

ArquivoDescrição
main.tsPonto de entrada para integração com editores (VS Code, por exemplo). Responsável por registrar o servidor da linguagem (Language Server).

📂 language/

ArquivoDescrição
hello-world.langiumArquivo da gramática da sua linguagem personalizada! Aqui você define as regras da linguagem (tokens, sintaxe, etc).
hello-world-module.tsConfiguração de injeção de dependências para os serviços da linguagem, como parser, validator e code generator.
hello-world-validator.tsValidações customizadas da linguagem. Exemplo: regras semânticas adicionais que vão além da gramática.
main.tsEntrada principal para inicializar a linguagem fora da extensão, por exemplo para testes ou CLI.

📂 language/generated/

⚙️ Arquivos gerados automaticamente pelo Langium a partir da gramática. Evite mexer manualmente.

ArquivoDescrição
ast.tsDefine as interfaces e tipos da Abstract Syntax Tree (AST) da linguagem, ou seja, a representação em árvore dos elementos da sua gramática.
grammar.tsRepresentação da gramática definida no .langium em forma de código para uso interno da engine.
module.tsMódulo gerado automaticamente que conecta os serviços básicos da linguagem.

📂 syntaxes/

ArquivoDescrição
hello-world.tmLanguage.jsonDefinição de tokens para syntax highlighting no VS Code. Esse arquivo determina como as palavras-chave e símbolos da sua linguagem serão coloridos no editor.

💡 Resumo Visual:

📦 Configuração e dependências
├── package.json / package-lock.json
├── tsconfig.json
├── langium-config.json

📝 Documentação
├── langium-quickstart.md

⚙️ Build
├── esbuild.mjs

💻 Código fonte
├── src/
│ ├── extension/ → Extensão do VSCode
│ └── language/ → Implementação da linguagem
│ ├── hello-world.langium → Gramática
│ ├── validator e module → Serviços e validação
│ └── generated/ → Arquivos automáticos (AST, grammar)

🎨 Syntax Highlighting
├── syntaxes/
│ └── hello-world.tmLanguage.json

6. Gerando Código para a Gramática

Após criar o projeto, temos que executar o comando abaixo, dentro da pasta do projeto, para instalar a bibliotecas necessárias:

npm install

Observe que o uma grmatica de exemplo foi criada em src/language/hello-world.langium.

grammar HelloWorld

entry Model:
(persons+=Person | greetings+=Greeting)*;

Person:
'person' name=ID;

Greeting:
'Hello' person=[Person:ID] '!';

hidden terminal WS: /\s+/;
terminal ID: /[_a-zA-Z][\w_]*/;
terminal INT returns number: /[0-9]+/;
terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/;

hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//;
hidden terminal SL_COMMENT: /\/\/[^\n\r]*/;

A gramatica apresentada permite que o usuário crie um um aquivo .hello com o seguinte conteúdo:

person Paulo
Hello Paulo!

Para o Langium processar a gramática e gerar os arquivos necessários para interpretar e validar sua linguagem é necessário executar o seguinte comando:

npm run langium:generate

7. Compilando o Projeto

Após a geração do código, compile o projeto com TypeScript:

npm run build

Este comando garante que todos os arquivos TypeScript sejam compilados e que o projeto esteja pronto para uso.

8. Executando e Testando a nossa linguagem

Para testar a nossa linguagem, vá no menu e clique em run--> Start Debugging, ou clique F5. Isso irá abrir o nova janela do Vscode.

Crie um novo arquivo chamado teste.hello e depois digite:

person Paulo
Hello Paulo!

Perceba que cada elemento da linguagem "Hello" e "Person" aparecem de cores diferentes do que as variáveis da linguagem "Paulo".

Parabéns você conseguiu criar a sua primeira linguagem com langium. No nível intermediário iremos fazer uma linguagem básica que permita criar funções em diferentes linguagens de programação.