Il linguaggio di comando della shell POSIX non è facile da analizzare, in gran parte a causa dello stretto accoppiamento tra lexing e parsing.Le grammatiche di espressione di parsing sono adatte all'analisi del linguaggio di comando della shell?
Tuttavia, le grammature di espressioni parsing (PEG) sono spesso senza scanner. Combinando il lexing e l'analisi, sembra che potrei evitare questi problemi. Il linguaggio che sto usando (Rust) ha una libreria PEG ben mantenuta. Tuttavia, sono a conoscenza di tre difficoltà che potrebbero rendere poco pratico l'utilizzo di questa libreria:
- I serbatoi devono essere in grado di analizzare riga per riga, senza leggere i caratteri oltre la fine della riga.
- alias sono puramente lessicale, e può causare un token per essere sostituito da qualsiasi sequenza di altri token in determinate situazioni
- Shell riservata parole sono riconosciuti solo in determinate situazioni
è un PEG adatta per l'analisi del linguaggio di comando della shell dati questi requisiti, o è un parser ricorsivo-discendente scritto a mano più adatto?
FWIW, bash utilizza un parser generato da bisonte abbastanza semplice, combinato con un lexer scritto a mano estremamente complicato. Non ho idea di quanto bene PEG avrebbe funzionato, ma se ci provi, faccelo sapere. – rici
Tre motivi: è GPL mentre la mia shell è sotto MIT/Apache 2, è in C mentre la mia shell è in Rust, e non imparerei nulla da essa. – Demi
Sì. I parser PEG eseguono la scansione. Il linguaggio grammaticale è più potente delle espressioni regolari e altrettanto compatto e conveniente. Ho tradotto diverse grammatiche ANTLR in Grako (PEG) e la parte lessicale è stata tradotta facilmente. Tuttavia, il PEG sarà meno efficiente di un lexer basato sullo stato macchina. – Apalala