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) | |