# Exemplo de código na mini linguagem
var x = 10;
var y = 5;
var resultado = x + y;
if (resultado > 12) {
print("Resultado maior que 12");
} else {
print("Resultado menor ou igual a 12");
}
# Exemplo parcial de gramática BNF
programa → declaração*
declaração → varDecl | ifStmt | printStmt
varDecl → "var" IDENT "=" expressão ";"
ifStmt → "if" "(" expressão ")" bloco
("else" bloco)?
bloco → "{" declaração* "}"
expressão → termo (("+" | "-") termo)*
# Gramática BNF para expressões aritméticas
expr → term (("+" | "-") term)*
term → factor (("*" | "/") factor)*
factor → INTEGER | "(" expr ")" | IDENTIFIER
# Exemplo simplificado de analisador léxico com PLY
import ply.lex as lex
# Lista de tokens
tokens = [
'IDENTIFIER',
'INTEGER',
'PLUS',
'MINUS',
'EQUALS',
'SEMICOLON',
]
# Palavras reservadas
reserved = {
'if' : 'IF',
'else' : 'ELSE',
'var' : 'VAR',
'print' : 'PRINT',
}
tokens = tokens + list(reserved.values())
# Regras para tokens
t_PLUS = r'\+'
t_MINUS = r'-'
t_EQUALS = r'='
t_SEMICOLON = r';'
# Identificadores e palavras reservadas
def t_IDENTIFIER(t):
r'[a-zA-Z][a-zA-Z_0-9]*'
t.type = reserved.get(t.value,'IDENTIFIER')
return t
# Números inteiros
def t_INTEGER(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)
lexer = lex.lex()
# Exemplo de regra para expressão de soma
def p_expression_binop(p):
'''expression : expression PLUS term
| expression MINUS term'''
if p[2] == '+':
p[0] = p[1] + p[3]
elif p[2] == '-':
p[0] = p[1] - p[3]
# Exemplo simplificado de parser para expressões
import ply.yacc as yacc
from lexer import tokens # importa tokens do analisador léxico
# Regras de precedência, do menor para o maior
precedence = (
('left', 'PLUS', 'MINUS'),
('left', 'TIMES', 'DIVIDE'),
)
# Regra inicial
def p_expression(p):
'expression : term'
p[0] = p[1]
# Expressões binárias
def p_expression_binop(p):
'''expression : expression PLUS term
| expression MINUS term'''
if p[2] == '+':
p[0] = ('add', p[1], p[3])
elif p[2] == '-':
p[0] = ('sub', p[1], p[3])
# Termo
def p_term(p):
'term : factor'
p[0] = p[1]
# Operações de termo
def p_term_binop(p):
'''term : term TIMES factor
| term DIVIDE factor'''
if p[2] == '*':
p[0] = ('mul', p[1], p[3])
elif p[2] == '/':
p[0] = ('div', p[1], p[3])
# Fator
def p_factor_num(p):
'factor : INTEGER'
p[0] = ('num', p[1])
# Identificador
def p_factor_id(p):
'factor : IDENTIFIER'
p[0] = ('var', p[1])
# Expressão entre parênteses
def p_factor_expr(p):
'factor : LPAREN expression RPAREN'
p[0] = p[2]
# Tratamento de erro
def p_error(p):
print(f"Erro de sintaxe: '{p.value}'")
parser = yacc.yacc()
# Arquivo de teste: exemplo.mini
var x = 10;
var y = 5;
var resultado = x + y;
if (resultado > 12) {
print("Maior que 12");
} else {
print("Menor ou igual a 12");
}
# Executando testes
$ python main.py exemplo.mini
# Saída esperada para teste léxico
TOKEN: VAR, valor: 'var'
TOKEN: IDENTIFIER, valor: 'x'
TOKEN: EQUALS, valor: '='
TOKEN: INTEGER, valor: 10
TOKEN: SEMICOLON, valor: ';'
...