Come gestire le espressioni create dall'utente nell'applicazione

1

Nella nostra applicazione gli utenti possono inserire espressioni personalizzate per calcolare determinate cose. Ad esempio, possono specificare una fattura e definire un numero di linee per il calcolo dei costi.

Esempio di un corso con $ 400 di $ 10 di costo di transazione e un numero di persone libere (diciamo a causa di qualche credito)

  • (? numberOfParticipants? -? creditetTickets?) * 400 + 10

Al momento disponiamo di un codice personalizzato che analizza ed esegue questo. Ma di recente abbiamo trovato un bug e abbiamo bisogno di dedicare un po 'di tempo a questo.

Potremmo migliorare l'attuale codice hacky, potremmo costruire un parser adeguato ma ritengo che questo sia un problema molto generico che molte persone hanno e ci dovrebbe essere una soluzione off the shelf ma non riesco a trovarne una.

Qualcuno riconosce questo problema e come lo hai gestito?

    
posta martijnve 15.01.2016 - 11:40
fonte

1 risposta

1

La tua espressione utilizza ciò che chiamiamo notazione infissa , che è la notazione comunemente usata nelle affermazioni aritmetiche.

Un modo per filtrare semplicemente tali espressioni è convertirle in Reverse Polish Notation (RPN) che le trasforma in una pila operazione basata su, ad esempio la tua espressione si trasformerebbe in:

PUSH numberOfParticipants
PUSH creditedtTickets
SUBSTRACT
PUSH 400
MULTIPLY
PUSH 10
ADD

Tale elenco non è codice, è solo una serie di passaggi da eseguire quando si desidera eseguire la formula.

Come puoi immaginare, ogni operazione (sottrazione, aggiunta, ecc.) apre gli ultimi due elementi dello stack e applica l'operazione su di essi, riportando il risultato nello stack.

Questo può essere salvato per l'esecuzione successiva. Lo esegui iterando attraverso i passaggi e eseguendo le operazioni nella lingua preferita.

Esiste un algoritmo noto e provato chiamato Algoritmo di smistamento per analizzare avanti e indietro tra la notazione infissa e RPN. Questo algoritmo tratta la parentesi e la precedenza degli operatori usando una metafora della giunzione ferroviaria. È possibile analizzare i passi dell'RPN nella notazione infix per mostrarli sullo schermo affinché gli utenti possano vederli.

    
risposta data 15.01.2016 - 13:37
fonte

Leggi altre domande sui tag