Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Syntax für Interpreter ok?

Empfohlene Antworten

Veröffentlicht

Hi!

Nach einem Jahr ausgiebigem trial and error hab ich endlich verstanden wie man einen Parser schreiben kann :D

Ich hab jetzt mal eine Syntax in EBNF definiert, wär nett wenn ihr mal nach Fehlern / Verbesserungsmöglichkeiten gucken könntet... Den Fehler den Parser mit Fehlerhafter EBNF zu schreiben hab ich bei meinem letzten Versuch gemacht ^^

Program = {Statement}.

Statement = (Declaration | Assignment | Call | IfSeq | WhileSeq | ForSeq) ";".


Declaration = VarDecl | ConstDecl.

VarDecl = "VAR" Type Ident.

ConstDecl = "CONST" Ident "=" (Integer | String).


Assignment = Ident ":=" (Expression | StrExpression).


Expression = Expr_LCmp.

Expr_LCmp = Expr_Cmp {("AND" | "OR" | "NOT" | "XOR") Expr_Cmp}.

Expr_Cmp = Expr_Sum [(">" | ">=" | "<" | "<=" | "==" | "!=") Expr_Sum].

Expr_Sum = Expr_Product {("+" | "-") Expr_Product}.

Expr_Product = Expr_Bit1 {("*" | "/") Expr_Bit1}.

Expr_Bit1 = Expr_Bit2 {("|" | "&") Expr_Bit2}.

Expr_Bit2 = Expr_Factor {("<<" | ">>" | "%" | "!") Expr_Factor}.

Expr_Factor = ("(" Expression ")") | Integer | Call | Ident.


StrExpression = (String | Call | Ident) {"+" (String | Call | Ident)}.


Call = Ident "(" {(Expression | StringExpression)} ")".


IfSeq = "IF" Expression Block.

WhileSeq = "WHILE" Expression Block.

ForSeq = "FOR" Ident ":=" Expression "TO" Expression Block.


Block = "{" {Statement} "}".

Du hast Type, Ident, String und Integer nicht definiert. Ansonsten sehe ich da aber auf den ersten Blick keine formalen Fehler.

Deine Operatoren sind allerdings etwas merkwürdig. Ich weiß nicht, ob du dich an eine bestimmte Sprache anlehnen willst, aber üblicherweise ordnet man den Modulooperator bei der "Punktrechnung" ein. Und in C, C++, C# oder Java(zum Beispiel) binden + und - stärker als die Shiftoperatoren.

Unter einem binären ! kann ich mir nichts vorstellen. Was soll der Ausdruck bewirken? Das logische Nicht ergibt nur unär einen Sinn.

Und schließlich könnte ein unäres Minus nicht schaden.

Danke für eure Antworten :)

Du hast Type, Ident, String und Integer nicht definiert. Ansonsten sehe ich da aber auf den ersten Blick keine formalen Fehler.

Deine Operatoren sind allerdings etwas merkwürdig. Ich weiß nicht, ob du dich an eine bestimmte Sprache anlehnen willst, aber üblicherweise ordnet man den Modulooperator bei der "Punktrechnung" ein. Und in C, C++, C# oder Java(zum Beispiel) binden + und - stärker als die Shiftoperatoren.

Unter einem binären ! kann ich mir nichts vorstellen. Was soll der Ausdruck bewirken? Das logische Nicht ergibt nur unär einen Sinn.

Und schließlich könnte ein unäres Minus nicht schaden.

Type, Ident, String und Integer erkennt schon der Scanner, deshalb brauch

ich das im Parser nicht nochmal zu tun ;)

"!" ist binäres XOR, die Operatoren und Reihenfolge hab ich erstmal von

PureBasic geklaut, das kann ich ja später noch ohne weiteres ändern...

Das unäre Minus hab ich vergessen, so sollts sein:

Expression = ["-"] Expr_LCmp.

Expr_LCmp = Expr_Cmp {("AND" | "OR" | "NOT" | "XOR") Expr_Cmp}.

;)

Edit: Verdammt, not ist ja unär ^^

So ists aber richtig oder?

Expr_LCmp = ["NOT"] Expr_Cmp {("AND" | "OR" | "XOR") ["NOT"] Expr_Cmp}.

Das erste mal zu langsam editiert :rolleyes: ^^

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.