Spaces:
Sleeping
Sleeping
import gradio as gr | |
import javalang | |
from collections import Counter | |
from typing import Dict, List | |
class JavaSyntaxAnalyzer: | |
"""Java-Inspector: Syntax and OO Paradigm Inspection in Java Code """ | |
def analyze_syntax(self, code: str) -> Dict[str, int]: | |
"""Analisa sintaticamente o código em diferentes categorias""" | |
results = Counter() | |
try: | |
tree = javalang.parse.parse(code) | |
# Declarações | |
results["Tipos Primitivos"] = len([ | |
node.type.name for _, node in tree.filter(javalang.tree.LocalVariableDeclaration) | |
if node.type.name in {"int", "double", "boolean", "char", "float", "long", "byte", "short"} | |
]) | |
results["Constantes (final)"] = sum( | |
1 for _, node in tree.filter(javalang.tree.FieldDeclaration) if "final" in node.modifiers | |
) | |
results["Variáveis Declaradas"] = len(list(tree.filter(javalang.tree.LocalVariableDeclaration))) | |
# Estruturas de Controle | |
results["If/Else"] = len(list(tree.filter(javalang.tree.IfStatement))) | |
results["Switch/Case"] = len(list(tree.filter(javalang.tree.SwitchStatement))) | |
results["For Loops"] = len(list(tree.filter(javalang.tree.ForStatement))) | |
results["While Loops"] = len(list(tree.filter(javalang.tree.WhileStatement))) | |
results["Do-While Loops"] = len(list(tree.filter(javalang.tree.DoStatement))) | |
# Operadores | |
code_snippet = code | |
operators = { | |
"Aritméticos": ["+", "-", "*", "/", "%"], | |
"Comparação": ["==", "!=", ">", "<", ">=", "<="], | |
"Lógicos": ["&&", "||", "!"], | |
"Atribuição": ["+=", "-=", "*=", "/="], | |
} | |
for category, ops in operators.items(): | |
results[category] = sum(code_snippet.count(op) for op in ops) | |
# Entrada/Saída e Strings | |
results["System.out.print"] = code_snippet.count("System.out.print") | |
results["Scanner"] = code_snippet.count("Scanner") | |
results["Concatenação de Strings"] = code_snippet.count("+") | |
string_methods = ["concat", "substring", "length", "equals", "compareTo"] | |
results["Métodos de String"] = sum(code_snippet.count(f".{method}(") for method in string_methods) | |
except Exception as e: | |
results["Erro"] = str(e) | |
return dict(results) | |
def analyze_oo(self, code: str) -> Dict[str, int]: | |
"""Analisa elementos do paradigma OO""" | |
results = Counter() | |
try: | |
tree = javalang.parse.parse(code) | |
# Classes e Objetos | |
results["Classes"] = len(list(tree.filter(javalang.tree.ClassDeclaration))) | |
results["Objetos"] = len([ | |
node for _, node in tree.filter(javalang.tree.VariableDeclarator) | |
if node.initializer and "new" in str(node.initializer) | |
]) | |
# Métodos | |
results["Métodos"] = len(list(tree.filter(javalang.tree.MethodDeclaration))) | |
# Atributos e Encapsulamento | |
fields = list(tree.filter(javalang.tree.FieldDeclaration)) | |
results["Atributos"] = len(fields) | |
results["Encapsulamento"] = sum( | |
1 for _, field in fields if "private" in field.modifiers | |
) | |
# Herança | |
results["Herança"] = len([ | |
node for _, node in tree.filter(javalang.tree.ClassDeclaration) if node.extends | |
]) | |
# Polimorfismo | |
results["Polimorfismo"] = len([ | |
node for _, node in tree.filter(javalang.tree.MethodDeclaration) | |
if "Override" in (node.annotations or []) | |
]) | |
except Exception as e: | |
results["Erro"] = str(e) | |
return dict(results) | |
def process_files(files) -> List[Dict]: | |
"""Processa múltiplos arquivos e analisa sintaxe e OO""" | |
analyzer = JavaSyntaxAnalyzer() | |
file_results = [] | |
for file in files: | |
with open(file.name, 'r', encoding='utf-8') as f: | |
code = f.read() | |
syntax_results = analyzer.analyze_syntax(code) | |
oo_results = analyzer.analyze_oo(code) | |
combined_results = {**syntax_results, **oo_results} | |
combined_results["Arquivo"] = file.name | |
file_results.append(combined_results) | |
return file_results | |
# Interface Gradio | |
with gr.Blocks(title="Java-Inspector") as demo: | |
gr.Markdown("# Java-Inspector: Syntax and OO Paradigm Inspection in Java Code") | |
gr.Markdown("Suba os arquivos Java para destrinchar as estruturas sintáticas e orientadas a objetos.") | |
file_input = gr.File(label="Arquivos Java", file_types=[".java"], file_count="multiple") | |
analyze_button = gr.Button("Analisar Arquivos") | |
output_table = gr.Dataframe( | |
label="Resultados", | |
headers=[ | |
"Arquivo", | |
"Tipos Primitivos", "Constantes", "Variáveis Declaradas", "If/Else", "Switch/Case", | |
"For Loops", "While Loops", "Do-While Loops", "Aritméticos", "Comparação", | |
"Lógicos", "Atribuição", "System.out", "Scanner", "Concatenação", "Métodos de String", | |
"Classes", "Objetos", "Métodos", "Atributos", "Encapsulamento", "Herança", "Polimorfismo" | |
] | |
) | |
def analyze_files(files): | |
results = process_files(files) | |
# Converte os resultados para uma lista de listas para exibição na tabela | |
formatted_results = [ | |
[ | |
result["Arquivo"], | |
result.get("Tipos Primitivos", 0), | |
result.get("Constantes (final)", 0), | |
result.get("Variáveis Declaradas", 0), | |
result.get("If/Else", 0), | |
result.get("Switch/Case", 0), | |
result.get("For Loops", 0), | |
result.get("While Loops", 0), | |
result.get("Do-While Loops", 0), | |
result.get("Aritméticos", 0), | |
result.get("Comparação", 0), | |
result.get("Lógicos", 0), | |
result.get("Atribuição", 0), | |
result.get("System.out.print", 0), | |
result.get("Scanner", 0), | |
result.get("Concatenação de Strings", 0), | |
result.get("Métodos de String", 0), | |
result.get("Classes", 0), | |
result.get("Objetos", 0), | |
result.get("Métodos", 0), | |
result.get("Atributos", 0), | |
result.get("Encapsulamento", 0), | |
result.get("Herança", 0), | |
result.get("Polimorfismo", 0), | |
] | |
for result in results | |
] | |
return formatted_results | |
analyze_button.click(fn=analyze_files, inputs=file_input, outputs=output_table) | |
if __name__ == "__main__": | |
demo.launch(share=True) | |