Qualcuno ha usato le "preferenze di selezione" fornite da MKS YACC?

StackOverflow https://stackoverflow.com/questions/478891

  •  20-08-2019
  •  | 
  •  

Domanda

Da quando non ho avuto alcuna risposta alla mia domanda Esiste un'alternativa a MKS YACC che supporta la sintassi delle preferenze di selezione o qualcosa di molto simile?, Farò la domanda più fondamentale:

  • Qualcuno ha usato le "preferenze di selezione" fornite da MKS YACC?

Se hai, per cosa l'hai usato? Inoltre, ha senso usarlo in qualcosa di diverso dall'ultima posizione in una regola?

Devo prendermi cura di una grammatica che figura regole come:

    TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN

A meno che non stia fraintendendo qualcosa, la preferenza di selezione incorporata non fornisce alcun valore in questo contesto.

Sfondo

MKS YACC supporta una notazione che il loro sito web chiama "Sintassi delle preferenze di selezione" Come parte di questa regola:

non_terminal1:  TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]

Quindi, queste regole dicono che a TOKEN1 seguito da a non_terminal2 e a TOKEN2 è un non_terminal1, a meno che il token successivo non sia un TOKEN3 nel qual caso si applica qualche altra regola.

(Non sono chiaro se l'articolo di parentesi possa essere un non terminale. Il codice che ho visto usando la notazione usa sempre un token o un paio di token separati da spazio e mai un non terminale. Neanche non sono Cancella se è richiesto il pulizia; ancora una volta, tutti gli esempi che ho visto usare il pulizia.)

È stato utile?

Soluzione

Jonathan. Alle 1:30 non sono pronto a provare a farlo da solo, ma qualunque cosa facciano quelle regole, possono essere solo una scorciatoia per le regole che potrebbero essere scritte in qualcosa come il normale BNF. Guardando questo, sembra che ciò che la "preferenza di selezione" sta facendo è permetterti di esprimere quelle che altrimenti sarebbero diverse produzioni con una regola grammaticale.

Ho fatto un po 'di scavo e ho trovato questo, che conferma la mia supposizione: ciò che fa la preferenza di selezione è che ti consente di inserire esplicitamente un lookahead, in modo che le regole che altrimenti sarebbero in conflitto possano essere disombizzate.

Quello che suggerirei è di pensare a come sarebbe una di queste regole se riscritto in YACC o BNF diretto. Sospetto che risulterà qualcosa di simile

TOKEN1 LPAREN non_terminal1 MULT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 DIVIDE TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 ADD TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 SUBTRACT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 EXP TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 MOD TOKEN2 non_terminal2 RPAREN
...

In modo che l'effetto complessivo sia prendere una regola per ogni operatore tranne uguale, il [^ La notazione è comune nelle varie lingue di Bell Labs per qualcosa come il complemento di un set.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top