BNF grammatica + Gold LALR parser, non riuscendo a distinguere caso speciale NewLine da spazio bianco

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

  •  11-09-2019
  •  | 
  •  

Domanda

  • voglio prendere in considerazione gli spazi bianchi e ritorni a capo come spazi bianchi normali.
  • voglio distinguere ritorni a capo da altri spazi bianchi inoltre per consentire caso speciale.

In primo tentativo di scrivere una grammatica compatibile fallisce.

Ecco la grammatica:

! ------------------------------------------------- Sets

{WS}           = {Whitespace} - {CR} - {LF}
{ID Head}      = {Letter} + [_]
{ID Tail}      = {Alphanumeric} + [_]
{String Chars} = {Printable} + {HT} - ["\]

! ------------------------------------------------- Terminals

! The following defines the Whitespace terminal using the {WS}
! set - which excludes the carriage return and line feed 
! characters

Whitespace    = {WS}+ | {CR}{LF} | {CR} | {LF}
!NewLine       = {CR}{LF} | {CR} | {LF}
MyNewLine      = {CR}{LF} | {CR} | {LF}
È stato utile?

Soluzione

Sono ambigua perché entrambi contengono lo stesso {CR}{LF} | {CR} | {LF} sottoinsieme.

Dato l'ingresso {CR}{LF} il parser non ha modo di dire quale terminale dovrebbe corrispondere.

Un parser table-driven non è realmente progettato per gestire "casi speciali" direttamente. Se si desidera ignorare a capo, in alcuni contesti, ma significato ai loro in altri allora dovrete gestire che nelle vostre riduzioni (cioè tokenize le nuove righe a parte, e gettarli nelle riduzioni), ma che sarà possibile ottenere brutto .

A (potenzialmente) soluzione migliore è quella di utilizzare tokenizer stati (eventualmente controllati dal parser), per modificare la modalità ingressi newline token. E 'difficile da dire senza comprendere appieno la grammatica. Inoltre, è stato un paio di anni da quando ho pasticciato con questa roba.

Altri suggerimenti

Credo che la grammatica è ambigua, nel senso che sia spazi e MyNewLine abbinare nuove charachters linea. Dal momento che getta una traballante facendo a modo tuo, io suggerisco di rilevamento di spaziatura e nuove linee separatamente e decidere cosa fare con il ritorno a capo su un caso per caso.

Io non sono troppo sperimentato nella zona, ma questo è quello che mi ricordo dalla mia teoria della classe di calcolo e la classe Compiler Design.

Spero che questo aiuta.

Una risposta tardiva.

Per il mio sgomento, io sono solo un recente fioritura tardiva ;-) membro.

Continua a utilizzare la solita line-based grammatica Dichiarazioni

! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}

Whitespace = {Whitespace Ch}+
Newline    = {CR}{LF} | {CR} | {LF}
! ====================================================================

Lo spazio bianco vs. Newline distinzione è già stato preso in considerazione!

Si consideri affrontare il tuo caso particolare quando si scrivono le regole di produzione.

Per il caso complesso che si può anche bisogno di definire alcuni terminale virtuale (tecnica avanzata).

È possibile approfondire la grammatica e la domanda per la pubblicazione di nuovo.

Ultima Modifica : Si prega, la quota se hai già affrontato la questione. Grazie.

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