BNF grammaire + Gold analyseur LALR, à défaut de distinguer cas particulier de NewLine Whitespace

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

  •  11-09-2019
  •  | 
  •  

Question

  • Je veux considérer comme des sauts de ligne et les espaces blancs normaux espaces blancs.
  • Je veux distinguer les nouvelles lignes d'autres espaces blancs de plus pour permettre cas particulier.

Première tentative d'écrire une grammaire conforme échoue.

Voici la grammaire:

! ------------------------------------------------- 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}
Était-ce utile?

La solution

Ils sont ambigus car ils contiennent tous deux le même {CR}{LF} | {CR} | {LF} sous-ensemble.

Compte tenu de l'entrée {CR}{LF} l'analyseur n'a aucun moyen de dire quel terminal il doit correspondre.

Un analyseur de table est axée sur pas vraiment conçu pour traiter « cas particuliers » directement. Si vous voulez ignorer les sauts de ligne dans certains contextes, mais attribuer un sens à eux dans d'autres, alors vous devrez gérer cela dans vos réductions (c.-à-tokenize les nouvelles lignes séparément et de les jeter dans vos réductions), mais qui se laid .

A (potentiellement) une meilleure solution consiste à utiliser tokenizer états (éventuellement contrôlés de l'analyseur), pour changer la façon dont les entrées sont tokenizés newline. Il est difficile de dire sans comprendre pleinement votre grammaire. De plus, il a été quelques années depuis que je suis sali avec ce genre de choses.

Autres conseils

Je pense que la grammaire est ambiguë en ce sens que les deux espaces et MyNewLine correspondent à de nouvelles charachters ligne. Comme il jette un bancal faire votre chemin, je vous suggère de détecter des lignes et espaces blancs nouvelles séparément et de décider quoi faire avec la nouvelle ligne sur un cas par cas.

Je ne suis pas trop connu dans la région, mais c'est ce que je me souviens de ma théorie de la classe de classe de calcul et de conception du compilateur.

J'espère que cela aide.

Une réponse tardive.

À mon grand désarroi, je suis juste un membre récent de retardataire ;-).

Continuez à utiliser la grammaire habituelle déclarations basé sur la ligne

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

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

Whitespace par rapport distinction Newline est déjà pris en compte!

Pensez à traiter votre cas particulier lors de l'écriture de vos règles de production.

Pour le cas complexe, vous peut même avoir besoin de définir certains terminaux virtuels (technique de pointe).

Vous pouvez élaborer votre grammaire et demander en postant à nouveau.

Dernière édition : S'il vous plaît, partagez si vous avez déjà abordé la question. Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top