-
Notifications
You must be signed in to change notification settings - Fork 0
Patricks Einführung
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)
cst := OhmExplicitSendsSmalltalk match: '2 + 3' startingFrom: #Expression.
evaluator := OhmExplicitSendsSmalltalk semanticAction: OhmPrint new.
evaluator value: cst.
Um eine Klasse anzulegen:
OhmSemanticAction subclass: #OhmPrint
es ist möglich SemanticActions bei der Grammar anzumelden, können dann den cst quasi "interpretieren"
OhmSmalltalk semanticAction: OhmSmalltalkEvaluator new
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
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
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