BNF-Grammatik + Gold LALR Parser, in Ermangelung eines Sonderfall NewLine von Leerzeichen zu unterscheiden

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

  •  11-09-2019
  •  | 
  •  

Frage

  • Ich möchte Leerzeichen und Zeilenumbrüche als normale Leerzeichen berücksichtigen.
  • Ich möchte Zeilenumbrüche von anderen Whitespaces unterscheiden, außerdem Sonderfall zu ermöglichen.

Erster Versuch eine nachgebende Grammatik zu schreiben versagt.

Hier ist die Grammatik:

! ------------------------------------------------- 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}
War es hilfreich?

Lösung

Sie sind eindeutig, da sie beide den gleichen Untersatz {CR}{LF} | {CR} | {LF} enthalten.

Bei der Eingabe {CR}{LF} der Parser keine Möglichkeit, das Terminal zu sagen hat, sollte es passen.

Ein tabellengesteuerte Parser nicht wirklich ist so konzipiert, „Spezialfälle“ direkt zu handhaben. Wenn Sie in manchen Kontexten ignorieren newlines wollen, aber in anderen sie zuschreiben bedeuten dann werden Sie, dass in Ihrer Reduzierung behandeln müssen (dh tokenize die Zeilenumbrüche getrennt, und entsorgen Sie sie in Ihren Abschlägen), aber das wird hässlich .

A (potentiell) bessere Lösung ist tokenizer Staaten zu verwenden (möglicherweise von dem Parser gesteuert), zu ändern, wie die Newline-Eingänge Token versehen werden. Es ist schwer zu sagen, ohne Ihre Grammatik vollständig zu verstehen. Plus, es ist schon ein paar Jahre her, seit ich mit diesem Zeug versaut habe.

Andere Tipps

Ich denke, die Grammatik in dem Sinne nicht eindeutig ist, dass sowohl Whitespaces und neue Linie charachters MyNewLine entspricht. Da es eine wackeliges ihm Ihre Art und Weise zu tun wirft, schlage ich vor Erkennung Leerzeichen und neue Zeilen getrennt und zu entscheiden, was auf einem von Fall zu Fall mit dem Newline zu tun.

Auch ich bin nicht in der Gegend erfahren, aber das ist, was ich von meiner Theorie der Berechnung Klasse und Compiler-Design-Klasse erinnern.

Ich hoffe, das hilft.

Eine späte Antwort.

Zu meiner Bestürzung, ich bin nur ein kürzliches Spätzünder ;-) Mitglied.

Halten Sie die übliche Line basierende Grammatik Erklärungen mit

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

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

Leer vs. Newline Unterscheidung ist bereits berücksichtigt!

Betrachten Sie Ihren Sonderfall Adressierung, wenn Ihre Produktionsregeln zu schreiben.

Für komplexen Fall können Sie sogar einige virtuellen Terminal definieren müssen (fortgeschrittene Technik).

Sie können Ihre Grammatik erarbeiten und sie bitten, indem sie es wieder veröffentlichen.

Letzte Änderung : Bitte, zu teilen, wenn Sie bereits das Problem angesprochen. Danke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top