hello.c
#include <stdio.h>
int main() {
printf("Olá, Compiladores!\n");
return 0;
}
gcc hello.c -o hello
./hello
erro.c
#include <stdio.h>
int main() {
int a = 10
printf("Valor: %d", a);
return 0;
}
interpretador.py
print("Olá, mundo da interpretação!")
python interpretador.py
gcc
tokenizador.py
import ply.lex as lex
tokens = ('NUM', 'PLUS',)
t_PLUS = r'\+'
t_NUM = r'\d+'
t_ignore = ' \t'
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
def t_error(t):
print("Caractere ilegal: ", t.value[0])
t.lexer.skip(1)
lexer = lex.lex()
lexer.input("23 + 45")
for tok in lexer:
print(tok)
import subprocess
subprocess.run(["gcc", "hello.c", "-o", "hello"])
subprocess.run(["./hello"])
gcc
.;
após um printf()
e veja o que o compilador reporta. Qual etapa detectou?int
, float
, char
e double
.scanf
com printf
int x = 10 + 5;
, identifique os tokens léxicos. (Feito no caderno ou verbal)."2+3"
) e exiba o resultado com eval()
.+
e -
.PLY
, modifique o exemplo anterior para reconhecer variáveis como x
, y1
..c
simples e o compile com gcc
.prinft
ao invés de printf
) e observe o erro.soma.c
com int soma(int a, int b)
. Compile como soma.so
e chame com ctypes
no Python.3 + 4 * (2 - 1)
.gcc
e clang
(se disponível). Verifique diferenças no binário.time
time gcc prog.c
para medir performance de códigos simples e grandes.x = y + 2 * z;
Exercício: a) identificar tokens b) montar a árvore sintática c) gerar código intermediário (pseudocódigo)gcc
, time
, nano
ou VS Code
ply
(pip install ply
)ctypes
para ligação Python/CCompilaçã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)