Mein Ziel ist es, einen Rechner in Haskell mit Text.ParserCombinators.ReadP, die +, -, *, /, ^, sowie Negation implementiert, und folgt PEMDAS. Zuerst muss ich eine String-Eingabe für einen mathematischen Ausdruck analysieren (MathExp
). Ein Teil des Code, den ich habe, ist wie folgt:Lesen Klammern und Negation
import Control.Applicative hiding (many)
import Control.Monad
import Data.Char
import Data.List
import Data.Ord
import Text.ParserCombinators.Readp
type Name = String
type Number = Int
data MathExp
= Number Number
| Neg MathExp
| Plus MathExp MathExp
| Minus MathExp MathExp
| Mult MathExp MathExp
| Div MathExp MathExp
| Pow MathExp MathExp
| Var String
deriving (Eq, Show)
parseNumber :: ReadP MathExp
parseNumber = do
skipSpaces
x <- munch1 isDigit
return (Number (read x :: Int))
parsePlus :: ReadP (MathExp -> MathExp -> MathExp)
parsePlus = do
x <- char '+'
return Plus
parseMinus :: ReadP (MathExp -> MathExp -> MathExp)
parseMinus = do
skipSpaces
x <- char '-'
return Minus
parsePlusMinus = choice [parsePlus, parseMinus] --parse both--
parseMult :: ReadP (MathExp -> MathExp -> MathExp)
parseMult = do
x <- char '*'
return Mult
parseDiv :: ReadP (MathExp -> MathExp -> MathExp)
parseDiv = do
x <- char '/'
return Div
parseMultDiv = choice [parseMult, parseDiv] --parse both M,D--
parsePow :: ReadP (MathExp -> MathExp -> MathExp)
parsePow = do
x <- char '^'
return Pow
parseNeg :: ReadP MathExp
parseNeg = undefined
parseParens = undefined
Ich habe kein Problem, die Parser kombiniert ich derzeit habe, mit chainl1
und chainr1
, Assoziativität und Vorrang in der richtigen Reihenfolge zu implementieren, aber ich habe keine Ahnung, wie man Negation und Klammern richtig implementieren.
Was ich weiß, wenn diese Negation auch ein -
Zeichen ist, und es kann entweder vor einer Ganzzahl, Klammern oder einer Variablen (Buchstabenfolge) stehen. Die Variablen sind ein weiterer Teil des Rechners (ich habe keine Probleme mit). Darüber hinaus kann eine Negation einen Leerraum enthalten; zum Beispiel 1+2* - 3
ist ein gültiger String-Eingang für diesen Rechner.
"PEMDAS" ist kein richtiges Wort. Meinst du "die Reihenfolge der Operationen"? – dfeuer
Ja, Reihenfolge der Operationen. – Harambe17
Hallo CS 161 Schüler, die diese Seite gefunden haben, indem Sie suchen, 1. Hausaufgaben nicht online posten. 2. Verlassen Sie sich nicht auf SO-Mitarbeiter, um Ihre Hausaufgaben für Sie zu machen. Wenn Sie Probleme haben, schreiben Sie auf der Piazza. Deshalb benutzen wir es. Und machen Sie sich mit der Kollaborationspolitik vertraut: http://cmsc-16100.cs.uchicago.edu/2017/policies.php Wir werden jede Lösung erwarten, die Sie einreichen, um die ursprüngliche Interaktion mit der Aufgabe zu demonstrieren. Mailen Sie uns, wenn Sie Fragen haben. Peace, Your Instructors –