Skip to content

Patricks Einführung

Paula-Kli edited this page Jul 28, 2020 · 1 revision

Ohm

Ohm baut keinen AbstractSyntaxTree auf sondern einen ConcreteSyntaxTree und dort steht expliziter drin, was der Code war.

In Ohm gibt es eine explizit definierte Grammatik, auf welche dann der Code getestet wird.

In jeder OhmGrammer ist bereits eine Instanz enthalten (Klassenseitig) und wir müssen die nicht extra instanziieren, sondern können diese gleich nutzen.
OhmExplicitSendsSmalltalk match: '2 + 3 * 5' startingFrom: #Expression

kleine Regelnamen: lexikalische Regel (die Grundbausteine)
grosse Regelnamen: syntaktische Regel (zerlegbare Knoten)

Workspace:

cst := OhmExplicitSendsSmalltalk match: '2 + 3' startingFrom: #Expression.
evaluator := OhmExplicitSendsSmalltalk semanticAction: OhmPrint new.
evaluator value: cst.

Um eine Klasse anzulegen: OhmSemanticAction subclass: #OhmPrint

SemanticAction

es ist möglich SemanticActions bei der Grammar anzumelden, können dann den cst quasi "interpretieren"
OhmSmalltalk semanticAction: OhmSmalltalkEvaluator new

Visitor

in Ohm sind bereits Visitor enthalten, allerdings "versteckt"
daher kann ich vom Evaluator die Methode value: aufrufen und bekomme die Auswertung des cst
evaluator value: cst

Beginn bei startingRule

StartingRule: aNode value: aChild
    ^ self value: aChild

AddExpPlus: aNode leftExp: leftChild with: x rightExp: rightChild
(Geschrieben wie Regel, restliche Parameter werden aufgefüllt)
    | leftResult rightResult |
    leftResult := self value: leftChild.
    rightResult := self value: rightChild.
    ^ leftResult + rightResult

zugehörige Regel in der Grammatik

AddExp:
    leftChild '+' rightChild --plus
    | differentRule

number: aNode with: aChild
    ^ aChild interval contents asNumber

das Intervall gibt an in welchem Interval die Kinder liegen contents gibt uns den Inhalt dieses Intervalls

Für alle relevanten Regeln eine Methode angeben, wie dieser Knoten ausgewertet werden soll

Whitespaces

Ohm skipped Whitespaces
lässt sich über Intervalle der Knoten aber zurückrechnen --> Leerzeilen, die mit Intent gesetzt wurden
Whitespaces werden gesehen und auch durch eine Regel ausgedrückt, dann aber verworfen
können sich aber durch die Intervalle wahrscheinlich zurückrechnen lassen, die jede OhmNode hat

verschiedene Grammatiken im Image

OhmExplicitSendsSmalltalk langsamer als OhmSmalltalk, aber Message sends sind expliziter aufgeführt
OhmExplicitSendsSmalltalk baut anderen Baum auf --> legen uns fest wenn wir diese Grammatik verwenden, wie wir OmegaPrint bauen

Clone this wiki locally