Spaces:
Running
Running
File size: 6,958 Bytes
17afc90 53d9f4b 17afc90 53d9f4b 17afc90 145aa8b 17afc90 a29f541 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
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)
|