La documentazione per Parsec.Expr.buildExpressionParser dice:Parsec.Expr ripetuto prefisso con priorità differenti
prefisso e suffisso operatori con la stessa precedenza può avvenire solo una volta (cioè --2 non è consentito se - è prefisso negato).
Tuttavia, vorrei analizzare tali stringhe.
In concreto, si consideri la seguente grammatica:
sentence:
| identifier
| "~" sentence
| sentence & sentence
| "!" sentence
Dove precedenza degli operatori è: "~"
si lega più forte di "&"
si lega più forte di "!"
Per esempio, vorrei la frase
! ~a & b
da analizzare come
! ((~a) & b)
E la frase
~ ! a & b
come
~(! (a & b))
Parsec mi permette di fare questo (e specificare la precedenza degli operatori), però, mi piacerebbe essere in grado di prefissi a catena, per esempio ~ ~ ! ~ a
. Parsec non consente questo. Ho trovato la soluzione for chaining prefixes, ma questa soluzione non mi consente di specificare una priorità operatore diversa per i diversi operatori di prefisso (sia "~" che "!" Vincolano più forte di "&" o nessuno di loro lo fa)
Qualcuno ha una soluzione per questo?
Edit:
soluzione parziale che ottiene le associazioni degli operatori corretti, ma permette nessuna concatenazione: http://lpaste.net/143362
soluzione parziale con concatenamento ma che ha un torto vincolante per l'operatore "~": http://lpaste.net/143364
Modifica: Altri chiarimenti relativi allo latest answer.
In realtà desidero associare lo &
. Sinistra o destra non importa. L'associatività sinistra-destra riguarda solo gli operatori con la stessa precedenza. Per i tuoi esempi, è tutto risolto osservando che &
lega più forte di !
(&
ha all'operatore maggiore precedenza)
Quindi, l'espressione si erano preoccupati:
a & ! b & c
dovrebbe diventare: (prima legarsi &
se possibile) a & ! (b & c)
Analogamente, ! a & ! b & c
devono essere analizzati (prima impegnare &) ! a & ! (b & c)
, quindi ! a & (! (b & c))
, quindi ! (a & (! (b & c)))
Puoi mostrare la vostra soluzione parziale? Ho codificato qualcosa su http://lpaste.net/143362 che non esegue concatenazioni o prefissi ripetuti, ma cerca solo di ottenere le priorità corrette. – ErikR
Ho due soluzioni parziali in modo acuto. Uno di questi assomiglia molto al tuo codice e ignora i prefissi ripetuti. L'altro fa il concatenamento, ma ottiene le priorità sbagliate. (stanno arrivando) – BartBog
Ho aggiunto le soluzioni parziali. Per essere precisi, ho recuperato uno dei tuoi e ho iniziato da quello per ottenere l'altro ... – BartBog