Für ein Projekt haben wir die Aufgabe, einen Hakkel-Parser/Evaluator zu erstellen, der einen winzigen Arduino-Roboter steuert.Parsec: Das Erweitern eines funktionierenden Parsers führt zu ungeraden Ergebnissen
Also zu Beginn von, ich habe im Grunde einige Nachforschungen über bereits implementiert Parser-Setups, und stieß auf diese: https://wiki.haskell.org/Parsing_a_simple_imperative_language.
Nachdem (zugegebenermaßen) Kopieren Sie den Code, begann ich es zu testen. Und es hat funktioniert. Jetzt war es an der Zeit, seine Funktionalität zu erweitern.
Edited Code:
data Stmt = Seq [Stmt]
| Assign String AExpr
| If BExpr Stmt Stmt
| While BExpr Stmt
| Motor String AExpr
| Skip
deriving (Show)
Token.reservedNames = [ "if"
, "then"
, "else"
, "while"
, "do"
, "skip"
, "true"
, "false"
, "not"
, "and"
, "or", "set" , "to"
]
statement' :: Parser Stmt
statement' = ifStmt
<|> whileStmt
<|> skipStmt
<|> assignStmt
<|> motorStatement
motorStatement :: Parser Stmt
motorStatement =
do reserved "set"
var <- identifier
reserved "to"
expr <- aExpression
return $ Motor var expr
Dies sind die einzigen Teile des Codes I bearbeitet. alles zu testen, habe ich eine kleine testdat:
x := 4;
x := 6;
Der obige Code beatifully vor meinen Änderungen analysiert, aber nachdem ich die Änderungen hinzugefügt bekomme ich folgende Fehler
< (line 3, column 1):
< unexpected end of input
< expecting "if", "while", "skip", identifier or "set"
Mit meinem begrenzten Wissen von Haskell kann ich nicht herausfinden, warum das "unexpected end of input
" passiert.
Vielleicht kann mir hier ein Haskeller den Fehler zeigen.
Lesen Ihrer Antwort gemacht Ich merke schnell meinen "Fehler". Jedes Semikolon macht es so, dass es eine andere Zeile/Aussage braucht/braucht. Und weil eine leere Zeile nicht in einen Typ konvertiert werden kann, ist sie fehlerhaft. Danke mein Herr! – MrKickkiller