Compilação é o processo de tradução de um programa escrito em uma linguagem de programação (código-fonte) para uma representação equivalente em outra linguagem, geralmente de mais baixo nível.
#include
int main() {
printf("Olá, mundo!\n");
return 0;
}
$ gcc hello.c -o hello
$ ./hello
Olá, mundo!
Um interpretador é um programa que executa diretamente instruções escritas em uma linguagem de programação, sem necessidade de compilação prévia para código de máquina.
# hello.py
print("Olá, mundo!")
# Execução
$ python hello.py
Olá, mundo!
// hello.c
#include
int main() {
printf("Olá, mundo!\n");
return 0;
}
// Compilação e execução
$ gcc hello.c -o hello
$ ./hello
Olá, mundo!
if (contador > 10) {
soma = soma + valor;
}
comando → if ( expressao ) bloco
bloco → { comandos }
comandos → comando | comando comandos
comando → identificador = expressao ;
expressao → termo | termo operador termo
termo → identificador | numero
python --version
pip install ply
python -c "import ply; print(ply.__version__)"
# analisador_lexico.py
import ply.lex as lex
# Lista de tokens
tokens = (
'NUMERO',
'MAIS',
'MENOS',
'VEZES',
'DIVIDE',
'LPAREN',
'RPAREN',
)
# Regras de expressão regular para tokens simples
t_MAIS = r'\+'
t_MENOS = r'-'
t_VEZES = r'\*'
t_DIVIDE = r'/'
t_LPAREN = r'\('
t_RPAREN = r'\)'
# Regra para números
def t_NUMERO(t):
r'\d+'
t.value = int(t.value)
return t
# Ignorar espaços e tabs
t_ignore = ' \t'
# Tratamento de erros
def t_error(t):
print(f"Caractere ilegal '{t.value[0]}'")
t.lexer.skip(1)
# Construir o analisador léxico
lexer = lex.lex()
# Testar com uma entrada
data = '3 + 4 * (10 - 5)'
lexer.input(data)
# Tokenizar
for tok in lexer:
print(tok)
LexToken(NUMERO,3,1,0)
LexToken(MAIS,'+',1,2)
LexToken(NUMERO,4,1,4)
LexToken(VEZES,'*',1,6)
LexToken(LPAREN,'(',1,8)
LexToken(NUMERO,10,1,9)
LexToken(MENOS,'-',1,12)
LexToken(NUMERO,5,1,14)
LexToken(RPAREN,')',1,15)