2017-08-15 3 views
1

Ich baue einen kleinen Compiler für eine Zuweisungssprache.Semantische Aktionen auf Menhir

die folgende Regel vor:

var_block : 
    | LPAREN var_decl+ RPAREN { var_scope := var_scope + 1 }; 

Ist die semantische Aktion ausgelöst, wenn var_block zuerst erkannt wird, oder es wird ausgelöst, wenn das Ende der Produktion erreicht ist (in diesem Fall RPAREN)?

Antwort

1

Es wird ausgelöst, nachdem die gesamte Produktion gelesen wurde.

+0

Vielen Dank für Ihre Antwort. Was wäre der beste Weg, um Kontextänderungen zwischen Deklarationen von Objekten in verschiedenen Blöcken und mit unterschiedlichen Speichereigenschaften zu verfolgen? –

+0

Es hängt davon ab, was genau Sie tun möchten. Eine einfache Sache wäre es, den semantischen Wert jeder Produktion zu einem Syntaxbaum zu machen, dann würde die 'var_block'-Produktion ihre Liste von Kindern einfach in einen anderen Baumknoten einbinden, der den Bereich markiert. –

5

Ihre Frage ist genau warum Sie das nicht tun sollten.

Führen Sie keine Nebeneffekte aus, die in Produktionsregeln auftragsabhängig sind. Produktionsregeln sollten verwendet werden, um eine Datenstruktur aufzubauen, die Ihr Programm darstellt. Sobald dies erledigt ist, können Sie analysieren/ausführen/was auch immer.

+0

Danke. Dieser Kommentar war nützlich, um meinen Ansatz über das spezielle Problem hinaus zu überdenken. –