elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  contribución mini ejemplo de lenguaje interpretado
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: contribución mini ejemplo de lenguaje interpretado  (Leído 3,258 veces)
sapito169


Desconectado Desconectado

Mensajes: 628



Ver Perfil
contribución mini ejemplo de lenguaje interpretado
« en: 15 Noviembre 2018, 21:32 pm »

hola para todos aquellos que se preguntan como crear su propio evaluador de expresiones del tipo 5*4 +3 -2 *(5) a qui les tengo un pequeño ejemplito en menos de 81 lineas y sin usar regex


Código
  1. package javaapplication17;
  2.  
  3. import java.util.HashMap;
  4.  
  5. public class Interpreter {
  6.  
  7.    private final HashMap<String, String> variables = new HashMap<>();
  8.  
  9.    public static void main(String[] args) {
  10.         Interpreter interpreter = new Interpreter();
  11.        //calculation
  12.        for (String text : new String[]{
  13.            "1",
  14.            "12",
  15.            "5^2",
  16.            "12+13",
  17.            "4+2-1",
  18.            "(1)",
  19.            "(4/2+1*2)",
  20.            "(1+3)+(5+6-3+13)",
  21.            "3*(4+2)",
  22.            "3*4*(5+3)+16+2",
  23.            "8*7+(4+3+6*(5+4))",}) {
  24.  
  25.            System.out.println("text= " + text + " " + interpreter.evalProgram(text));
  26.        }
  27.        //programing feature booleans
  28.        System.out.println();
  29.        System.out.println("booleans");
  30.        System.out.println();
  31.        for (String text : new String[]{
  32.            "1<2",
  33.            "2>3",
  34.            "12>13",
  35.            "12<14",
  36.            "(5+1)<14",
  37.            "14<(5+1)",
  38.            "(1+2)-3<4*2",
  39.            "true",
  40.            "false",
  41.            "false&true",
  42.            "false&true",
  43.            "false&true|true",
  44.            "true&false|true",
  45.            "1+2<3&4<2|false",
  46.            "(1+2)*3-1<4|false&true|(3+1)<4"}) {
  47.            Interpreter programEvaluetor = new Interpreter();
  48.            final String evalBoolean = programEvaluetor.evalProgram(text);
  49.            System.out.println(text + " = " + evalBoolean);
  50.        }
  51.        //simple scripts
  52.  
  53.        System.out.println();
  54.        System.out.println("programs");
  55.        System.out.println();
  56.        for (String text : new String[]{
  57.            "1",
  58.            "3+2-1",
  59.            "3+2-1\n1+2+1",
  60.            "4*5\n5*3",
  61.            "5*8\n4+2\n5+5+5",
  62.            "a=3*4\na",
  63.            "b=3*4\nb",
  64.            "abc=3*4\nabc\ncde=2*5+1\ncde",
  65.            "a=2\nb=3\nc=a+b\nc",
  66.            "c=true\nc",}) {
  67.            Interpreter programEvaluetor = new Interpreter();
  68.            System.out.println("=======program================================");
  69.            System.out.println(text);
  70.            System.out.println("=======endprogram=============================");
  71.            System.out.println("=======output program=========================");
  72.            System.out.println(programEvaluetor.evalProgram(text));
  73.            System.out.println("=======end output program=====================");
  74.            System.out.println("");
  75.            System.out.println("");
  76.        }
  77.  
  78.        //conditionals programs
  79.        System.out.println();
  80.        System.out.println("conditionals programs");
  81.        System.out.println();
  82.        for (String text : new String[]{
  83.            "1\nif(true){\n2\n}",
  84.            "if(false){\n1\n}",
  85.            "2\nif(true){\n1\n}",
  86.            "2\nif(false){\n1\n}\n3",
  87.            "1\nif(true){\n2\n}\n3",}) {
  88.            Interpreter programEvaluetor = new Interpreter();
  89.            System.out.println("=======program================================");
  90.            System.out.println(text);
  91.            System.out.println("=======endprogram=============================");
  92.            System.out.println("=======output program=========================");
  93.            System.out.println(programEvaluetor.evalProgram(text));
  94.            System.out.println("=======end output program=====================");
  95.            System.out.println("");
  96.            System.out.println("");
  97.        }
  98.        //conditionals programs
  99.    }
  100.  
  101.    private boolean evalCondition(String condition) {
  102.        final String evalBoleanExpresion = evalBoleanExpresion(condition.substring(3, condition.length() - 2));
  103.        return Boolean.parseBoolean(evalBoleanExpresion);
  104.    }
  105.  
  106.    private String evalProgram(final String expresion) {
  107.        String[] comands = expresion.split("\n");
  108.        String result = "";
  109.        boolean run = true;
  110.        for (int i = 0; i < comands.length; i++) {
  111.            String comand = comands[i];
  112.            if (comand.startsWith("if")) {
  113.                run = evalCondition(comand);
  114.                continue;
  115.            }
  116.  
  117.            if (comand.startsWith("}")) {
  118.                run = true;
  119.                continue;
  120.            }
  121.  
  122.            if (run) {
  123.                final String evalComand = evalComand(comand);
  124.                if (!evalComand.isEmpty()) {
  125.                    result += evalComand + "\n";
  126.                }
  127.            }
  128.  
  129.        }
  130.  
  131.        return result.isEmpty() ? "" : result.substring(0, result.length() - 1);
  132.    }
  133.  
  134.    private String evalComand(String expresion) {
  135.        String[] comandPart = expresion.split("=");
  136.        String result = "";
  137.  
  138.        if (comandPart.length == 1) {
  139.            String candidate = comandPart[0];
  140.            if (candidate.equals("true") || candidate.equals("false")) {
  141.                return eval(expresion);
  142.            }
  143.            if (candidate.chars().allMatch(Character::isLetter)) {
  144.                return "" + variables.get(candidate);
  145.            }
  146.            return eval(expresion);
  147.        }
  148.        if (comandPart.length == 2) {
  149.            variables.put(comandPart[0], (eval(comandPart[1])));
  150.  
  151.            return "";
  152.        }
  153.  
  154.        return result;
  155.    }
  156.  
  157.    private String eval(String inputString) {
  158.  
  159.        String buffer = "";
  160.        int beginIndex = -1;
  161.  
  162.        for (int i = 0; i < inputString.length(); i++) {
  163.            final char character = inputString.charAt(i);
  164.            if (character == '(') {
  165.                beginIndex = i;
  166.                buffer = "";
  167.                buffer += character;
  168.            }
  169.            if (!buffer.isEmpty()) {
  170.                String charLetter = (character + "");
  171.                buffer += charLetter.equals("(") || charLetter.equals(")") ? "" : charLetter;
  172.            }
  173.            if (character == ')') {
  174.  
  175.                buffer += character;
  176.                inputString = inputString.substring(0, beginIndex) + evalParentesis(buffer) + inputString.substring(beginIndex + buffer.length());
  177.                i = 0;
  178.                buffer = "";
  179.  
  180.            }
  181.        }
  182.  
  183.        return "" + evalExpresion(inputString);
  184.    }
  185.  
  186.    private String evalParentesis(String coeficientString) {
  187.  
  188.        return evalExpresion(coeficientString.substring(1, coeficientString.length() - 1));
  189.    }
  190.  
  191.    private String evalExpresion(String expresion) {
  192.        String result = "";
  193.        if (expresion.contains("<")
  194.                || expresion.contains(">")
  195.                || expresion.contains("&")
  196.                || expresion.contains("|")
  197.                || expresion.contains("true")
  198.                || expresion.contains("false")) {
  199.            result = evalBoleanExpresion(expresion);
  200.        } else {
  201.            result = evalAddExpresion(expresion) + "";
  202.        }
  203.  
  204.        return result;
  205.    }
  206.  
  207.    private int evalAddExpresion(String expresion) {
  208.        char[] characters = expresion.toCharArray();
  209.        String buffer = "";
  210.        int result = 0;
  211.        for (int i = 0; i < expresion.length(); i++) {
  212.            char character = expresion.charAt(i);
  213.            buffer += character;
  214.            if (i == characters.length - 1
  215.                    || characters[i + 1] == '+'
  216.                    || characters[i + 1] == '-') {
  217.  
  218.                if (buffer.startsWith("-")) {
  219.                    result -= evalSub(buffer.replace("-", ""));
  220.                } else {
  221.                    result += evalSub(buffer.replace("+", ""));
  222.                }
  223.                buffer = "";
  224.            }
  225.  
  226.        }
  227.  
  228.        return result;
  229.    }
  230.  
  231.    private int evalSub(final String expresion) {
  232.        char[] characters = expresion.toCharArray();
  233.        String buffer = "";
  234.        int result = 1;
  235.        for (int i = 0; i < expresion.length(); i++) {
  236.            char character = expresion.charAt(i);
  237.            buffer += character;
  238.            if (i == characters.length - 1
  239.                    || characters[i + 1] == '*'
  240.                    || characters[i + 1] == '/') {
  241.  
  242.                if (buffer.startsWith("/")) {
  243.                    result /= evalExpo(buffer.replace("/", ""));
  244.                } else {
  245.                    result *= evalExpo(buffer.replace("*", ""));
  246.                }
  247.                buffer = "";
  248.            }
  249.  
  250.        }
  251.  
  252.        return result;
  253.    }
  254.  
  255.    private int evalExpo(final String expresion) {
  256.        char[] characters = expresion.toCharArray();
  257.        String buffer = "";
  258.        int result = 1;
  259.        for (int i = expresion.length() - 1; i >= 0; i--) {
  260.            char character = expresion.charAt(i);
  261.            buffer = character + buffer;
  262.            if (i == 0 || characters[i - 1] == '^') {
  263.                result = (int) (Math.pow(Integer.parseInt(evalElement(buffer.replace("^", ""))), (result)));
  264.                buffer = "";
  265.            }
  266.  
  267.        }
  268.        return result;
  269.    }
  270.  
  271.    private String evalElement(String expresion) {
  272.  
  273.        if (expresion.chars().allMatch(Character::isLetter)) {
  274.            return variables.get(expresion);
  275.        } else {
  276.            return expresion;
  277.        }
  278.  
  279.    }
  280.  
  281.    private String evalBoleanExpresion(String expresion) {
  282.        char[] characters = expresion.toCharArray();
  283.        String buffer = "";
  284.        boolean result = true;
  285.        for (int i = 0; i < expresion.length(); i++) {
  286.            char character = expresion.charAt(i);
  287.            buffer += character;
  288.            if (i == characters.length - 1
  289.                    || characters[i + 1] == '&'
  290.                    || characters[i + 1] == '|') {
  291.  
  292.                if (buffer.startsWith("&")) {
  293.                    result &= Boolean.parseBoolean(evalBooleanElement(buffer.replace("&", "")));
  294.                } else if (buffer.startsWith("|")) {
  295.                    result |= Boolean.parseBoolean(evalBooleanElement(buffer.replace("|", "")));
  296.                } else {
  297.                    result = Boolean.parseBoolean(evalBooleanElement(buffer));
  298.                }
  299.                buffer = "";
  300.            }
  301.  
  302.        }
  303.  
  304.        return result + "";
  305.    }
  306.  
  307.    private String evalBooleanElement(final String expresion) {
  308.        String result = "";
  309.        if (expresion.contains("<") || expresion.contains(">")) {
  310.  
  311.            String[] split = expresion.split("<|>");
  312.            String left = evalExpresion(split[0]);
  313.            String right = evalExpresion(split[1]);
  314.  
  315.            if (expresion.contains("<")) {
  316.                result = "" + (Integer.parseInt(left) < Integer.parseInt(right));
  317.  
  318.            }
  319.            if (expresion.contains(">")) {
  320.                result = "" + (Integer.parseInt(left) > Integer.parseInt(right));
  321.            }
  322.        } else {
  323.            result = expresion;
  324.        }
  325.  
  326.        return result;
  327.    }
  328. }
  329.  
  330.  
  331.  

en un futuro agregare la funcionalidad de de agregar variables funciones bucles y condicionales para que se paresca a javascript   ::)

porfavor cuentenme lo que quieran del post preguntas traumas amensas o respuesta troll pero no me ignoren por que soy una perra de atención


diganme si lo han usado y en que


« Última modificación: 19 Noviembre 2018, 23:22 pm por sapito169 » En línea

antopixel

Desconectado Desconectado

Mensajes: 10



Ver Perfil
Re: contribución mini ejemplo de lenguaje interpretado
« Respuesta #1 en: 16 Noviembre 2018, 16:35 pm »

Excelente la idea compañero, habia visto algo similar utilizando pilas para saber si una ecuacion estaba bien escrita o no, pero se ve igualmente muy limpio tu codigo. Espero nuevas versiones.


En línea

sapito169


Desconectado Desconectado

Mensajes: 628



Ver Perfil
Re: contribución mini ejemplo de lenguaje interpretado
« Respuesta #2 en: 16 Noviembre 2018, 17:46 pm »

ahora estoy trabajando en el algebrea booleana para luego hacer condicionales
luego hare funciones y talves termine en bucles

bueno este desarrollo es incremental y tendre un tiempo de refactoring para mejorar el rendimiento la testeabilidad y facilidad de lectura

ya he escrito codigo mas complicado y con mas limpieza

***** que p**a he hecho con mi vida he puesta a la programación en un pedestal le dedique mucho de mi no se si esta bien o esta mal no se que mas sentir

la sarna con gusto no pica

estoy estudiando AI

quieren que les enseñe como se usa inteligencia artificial para hacer cosas aterradoras
saltar captchas, controlar los clasificadores de imagen ( que reconoscan mal el rostro ) una aplicacion con un solo botonazo y devuelva shell para los que tienen el dedo gordo como yo

hagan su pedido
« Última modificación: 16 Noviembre 2018, 18:18 pm por sapito169 » En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: contribución mini ejemplo de lenguaje interpretado
« Respuesta #3 en: 16 Noviembre 2018, 18:24 pm »

ahora estoy trabajando en el algebrea booleana para luego hacer condicionales
luego hare funciones y talves termine en bucles

bueno este desarrollo es incremental y tendre un tiempo de refactoring para mejorar el rendimiento la testeabilidad y facilidad de lectura

ya he escrito codigo mas complicado y con mas limpieza

***** que p**a he hecho con mi vida he puesta a la programación en un pedestal le dedique mucho de mi no se si esta bien o esta mal no se que mas sentir

la sarna con gusto no pica

estoy estudiando AI

quieren que les enseñe como se usa inteligencia artificial para hacer cosas aterradoras
saltar captchas, controlar los clasificadores de imagen ( que reconoscan mal el rostro ) una aplicacion con un solo botonazo y devuelva shell para los que tienen el dedo gordo como yo

hagan su pedido


Hola doc,

interesado harás un tutorial?

algo con open cv ?

google usa mucho de java tambien para backend front end, e igual manera, por ejemplo polymer donde va mas a estándar de web components doc, consiguiendo reemplazar si mal no recuerdo a google web toolkit un compilador de codigo java el codigo fuente .java a html,css,y js


ahora mismo estoy probando selenium web driver, con tesseract y opencv
« Última modificación: 16 Noviembre 2018, 18:42 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
sapito169


Desconectado Desconectado

Mensajes: 628



Ver Perfil
Re: contribución mini ejemplo de lenguaje interpretado
« Respuesta #4 en: 16 Noviembre 2018, 18:45 pm »

recien estoy estudiando y mejorando mi habilidad en IA cuando tenga algo hare tutorial bueno y si les es importante usar opencv lo hare con eso
En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: contribución mini ejemplo de lenguaje interpretado
« Respuesta #5 en: 16 Noviembre 2018, 19:00 pm »

recien estoy estudiando y mejorando mi habilidad en IA cuando tenga algo hare tutorial bueno y si les es importante usar opencv lo hare con eso

yo apunto por opencv es bastante bueno y muy usado. no solamente con python jajaj  :xD
En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
sapito169


Desconectado Desconectado

Mensajes: 628



Ver Perfil
Re: contribución mini ejemplo de lenguaje interpretado
« Respuesta #6 en: 21 Noviembre 2018, 17:28 pm »

ya es demasiado difícil entrar a temas mas avanzados (que estoy interesado en desarrollador) con una sola clase seria demasiado grande difícil de atender y muy frágil así que cambio de estrategia

voy a crear una clase interpretador que transforme el código fuente en una lista de instruciones tipo ensamblador y realize una seria de normalizaciones y pequeñas limpieza para que no tengas que crear codigo fuente de manera perfecta a la primera ves y si no se puede informara la linea del error

luego tendre una clase para el preporcesamiento de los comandos (para las validaciones para que te diga si estas escribiendo estupidez que nunca funcionaran)   y post procesacion de los comandos(para las optimizaciones)

luego una clase maquina virtual para que se encarge de ejecutar los comandos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Contribucion] Modulos Common Dialogs y Systray
Programación Visual Basic
Sancho.Mazorka 6 2,314 Último mensaje 6 Abril 2007, 02:38 am
por Sancho.Mazorka
mini y simple donwloader ejemplo « 1 2 »
Programación Visual Basic
?¿? 10 3,800 Último mensaje 19 Noviembre 2008, 18:14 pm
por s E t H
AYUDA Es esto un lenguaje interpretado/scripting?
Programación C/C++
prometheus48 5 3,389 Último mensaje 25 Mayo 2012, 17:12 pm
por Eternal Idol
contribucion ejemplo de eventbus
Java
sapito169 6 4,549 Último mensaje 19 Enero 2021, 05:20 am
por sapito169
mini contribucion algunos mini scripts que uso a acada rato
Java
sapito169 0 4,116 Último mensaje 12 Junio 2023, 18:32 pm
por sapito169
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines