Skip to content

📖 Especificação da Linguagem-Fonte C

Compilador C → Python

Este documento define o subconjunto da linguagem C que será a linguagem fonte do nosso compilador, incluindo tokens, estruturas sintáticas, semântica e exemplos de tradução para Python.


🔤 Especificação de Tokens

Palavras-Chave (Keywords)

// Tipos de dados
int float char void

// Estruturas de controle
if else while for do switch case default break continue

// Funções e escopo
return

// Inclusões (limitado)
#include

// Entrada/Saída
printf scanf

// Valores especiais
NULL

Operadores

Aritméticos

+    // Adição
-    // Subtração
*    // Multiplicação
/    // Divisão
%    // Módulo
++   // Incremento
--   // Decremento

Relacionais

==   // Igual
!=   // Diferente
<    // Menor
<=   // Menor ou igual
>    // Maior
>=   // Maior ou igual

Lógicos

&&   // E lógico
||   // OU lógico
!    // NÃO lógico

Atribuição

=    // Atribuição simples
+=   // Atribuição com adição
-=   // Atribuição com subtração
*=   // Atribuição com multiplicação
/=   // Atribuição com divisão

Delimitadores

{    }    // Chaves (blocos)
(    )    // Parênteses (expressões, funções)
[    ]    // Colchetes (arrays)
;         // Ponto e vírgula (fim de statement)
,         // Vírgula (separador)

Literais

Números Inteiros

42       // Decimal
0x2A     // Hexadecimal
052      // Octal

Números de Ponto Flutuante

3.14     // Float simples
2.5f     // Float com sufixo
1.23e-4  // Notação científica

Caracteres

'a'      // Caractere simples
'\n'     // Caractere de escape
'\0'     // Caractere nulo

Strings

"Hello"          // String simples
"Hello\nWorld"   // String com escape
""               // String vazia

Identificadores

// Formato: [a-zA-Z_][a-zA-Z0-9_]*
variavel
_contador
MAX_SIZE
funcao1
array_dados

🏗️ Estruturas Sintáticas Suportadas

1. Declarações de Variáveis

Declaração Simples

C:

int x;
float y;
char c;

Python:

x = 0        # int inicializado com 0
y = 0.0      # float inicializado com 0.0
c = '\0'     # char inicializado com char nulo

Declaração com Inicialização

C:

int x = 10;
float pi = 3.14;
char letra = 'A';

Python:

x = 10
pi = 3.14
letra = 'A'

Arrays

C:

int numeros[5];
int valores[3] = {1, 2, 3};
char nome[10];

Python:

numeros = [0] * 5
valores = [1, 2, 3]
nome = ['\0'] * 10

2. Expressões

Aritméticas

C:

resultado = a + b * c;
x = (y + z) / 2;
contador++;
valor *= 3;

Python:

resultado = a + b * c
x = (y + z) // 2      # Divisão inteira quando apropriado
contador += 1
valor *= 3

Relacionais e Lógicas

C:

if (x > 0 && y < 10) {
    // código
}

bool resultado = (a == b) || (c != d);

Python:

if x > 0 and y < 10:
    # código
    pass

resultado = (a == b) or (c != d)

3. Estruturas de Controle

If/Else

C:

if (condicao) {
    printf("Verdadeiro\n");
} else if (outra_condicao) {
    printf("Outra\n");
} else {
    printf("Falso\n");
}

Python:

if condicao:
    print("Verdadeiro")
elif outra_condicao:
    print("Outra")
else:
    print("Falso")

While

C:

while (i < 10) {
    printf("%d\n", i);
    i++;
}

Python:

while i < 10:
    print(i)
    i += 1

For

C:

for (int i = 0; i < 10; i++) {
    printf("%d\n", i);
}

Python:

for i in range(10):
    print(i)

4. Funções

Definição de Função

C:

int somar(int a, int b) {
    return a + b;
}

void imprimir_msg(char* mensagem) {
    printf("%s\n", mensagem);
}

Python:

def somar(a, b):
    return a + b

def imprimir_msg(mensagem):
    print(mensagem)

Função Main

C:

#include <stdio.h>

int main() {
    printf("Hello World\n");
    return 0;
}

Python:

def main():
    print("Hello World")
    return 0

if __name__ == "__main__":
    main()

5. Entrada e Saída

Printf

C:

printf("Numero: %d\n", x);
printf("Float: %.2f\n", y);
printf("Char: %c\n", c);
printf("String: %s\n", str);

Python:

print(f"Numero: {x}")
print(f"Float: {y:.2f}")
print(f"Char: {c}")
print(f"String: {str}")

Scanf (Simplificado)

C:

scanf("%d", &x);
scanf("%f", &y);

Python:

x = int(input())
y = float(input())

📋 Gramática Formal (BNF)

Programa

program         → declaration_list

declaration_list → declaration_list declaration
                 | declaration

declaration     → var_declaration
                | fun_declaration
                | include_declaration

include_declaration → '#include' '<' ID '>'
                    | '#include' STRING_LIT

Declarações de Variáveis

var_declaration → type_specifier ID ';'
                | type_specifier ID '=' expression ';'
                | type_specifier ID '[' INT_LIT ']' ';'
                | type_specifier ID '[' INT_LIT ']' '=' '{' expression_list '}' ';'

type_specifier  → 'int' | 'float' | 'char' | 'void'

Declarações de Funções

fun_declaration → type_specifier ID '(' params ')' compound_stmt

params          → param_list | 'void' | ε

param_list      → param_list ',' param
                | param

param           → type_specifier ID
                | type_specifier ID '[' ']'

Comandos

compound_stmt   → '{' local_declarations statement_list '}'

statement_list  → statement_list statement
                | ε

statement       → expression_stmt
                | compound_stmt
                | selection_stmt
                | iteration_stmt
                | return_stmt

expression_stmt → expression ';'
                | ';'

selection_stmt  → 'if' '(' expression ')' statement
                | 'if' '(' expression ')' statement 'else' statement

iteration_stmt  → 'while' '(' expression ')' statement
                | 'for' '(' expression_stmt expression_stmt expression ')' statement

return_stmt     → 'return' ';'
                | 'return' expression ';'

Expressões

expression      → var '=' expression
                | simple_expression

simple_expression → additive_expression relop additive_expression
                  | additive_expression

relop           → '<=' | '<' | '>' | '>=' | '==' | '!='

additive_expression → additive_expression addop term
                    | term

addop           → '+' | '-'

term            → term mulop factor
                | factor

mulop           → '*' | '/' | '%'

factor          → '(' expression ')'
                | var
                | call
                | INT_LIT
                | FLOAT_LIT
                | CHAR_LIT

call            → ID '(' args ')'

args            → arg_list | ε

arg_list        → arg_list ',' expression
                | expression

var             → ID
                | ID '[' expression ']'

🎯 Mapeamento de Tipos C → Python

Tipo C Tipo Python Inicialização Observações
int int 0 Números inteiros
float float 0.0 Números de ponto flutuante
char str '\0' Caractere único como string
char[] list[str] ['\0'] * size Array de caracteres
int[] list[int] [0] * size Array de inteiros
void None - Tipo de retorno vazio

🚨 Tratamento de Erros

Erros Léxicos

  • Caracteres não reconhecidos
  • Literais malformados
  • Comentários não fechados

Erros Sintáticos

  • Parênteses não balanceados
  • Chaves não balanceadas
  • Ponto e vírgula ausente
  • Estrutura de função inválida

Erros Semânticos

  • Variável não declarada
  • Redeclaração de variável
  • Tipo incompatível em atribuição
  • Função não declarada
  • Número incorreto de argumentos

📊 Limitações do Subconjunto C

Não Suportado (Versão Inicial)

  • Ponteiros (*, &)
  • Estruturas (struct)
  • Uniões (union)
  • Enumerações (enum)
  • Arquivos múltiplos
  • Preprocessador complexo
  • Bibliotecas externas (além de stdio.h básico)
  • Recursão complexa
  • Arrays multidimensionais
  • Strings como char*

Funcionalidades Futuras (Sprints Posteriores)

  • Ponteiros básicos
  • Estruturas simples
  • Arrays multidimensionais
  • Mais bibliotecas padrão
  • Otimizações de código

🧪 Casos de Teste Representativos

Teste 1: Programa Básico

Entrada:

#include <stdio.h>

int main() {
    int x = 10;
    int y = 20;
    int soma = x + y;
    printf("Soma: %d\n", soma);
    return 0;
}

Teste 2: Função com Parâmetros

Entrada:

int multiplicar(int a, int b) {
    return a * b;
}

int main() {
    int resultado = multiplicar(5, 3);
    printf("Resultado: %d\n", resultado);
    return 0;
}

Teste 3: Estruturas de Controle

Entrada:

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            printf("%d é par\n", i);
        } else {
            printf("%d é ímpar\n", i);
        }
    }
    return 0;
}

Teste 4: Arrays

Entrada:

int main() {
    int numeros[5] = {1, 2, 3, 4, 5};
    int soma = 0;

    for (int i = 0; i < 5; i++) {
        soma += numeros[i];
    }

    printf("Soma: %d\n", soma);
    return 0;
}

Versão: 1.0
Data: 17 de Setembro de 2025
Equipe: Grupo 10 - Compiladores 1