Haskell解析表达式

时间:2017-10-02 22:49:24

标签: parsing haskell expression

您好我得到了这样的代码:

* + 2 3 * 2 + 6 - 2

因此,使用此代码的想法是使用一个字符串,如((2 + 3) * (2 * (6 - 2))),它将表示为const connectToDatabase = () => { let db; if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production') { db = new sqlite3.Database('task_list'); } else if (process.env.NODE_ENV === 'test') { db = new sqlite3.Database(':memory:'); } else { throw new Error('Environment is not defined!'); } db.pRun = promisify(db.run, db); db.pGet = promisify(db.get, db); db.pAll = promisify(db.all, db); db.pClose = promisify(db.close, db); return db; }; ,然后使用此字符串将部分字符串放在其中。当然最后找到结果,在这种情况下40.问题是我不太了解解析,所以我真的不知道如何解析这样的表达式。我已经看到了一些简单的解析,其中字符串被解析为类型,如人或类似的东西。但我认为这有点复杂。如果有人有任何建议,我会非常感兴趣。

1 个答案:

答案 0 :(得分:6)

虽然Haskell存在复杂的解析库,并且对于此任务非常有用,但是输入格式非常简单,以至于手动解析并不太强烈,使用递归函数来消耗输入并返回解析后的表达式和要继续解析的字符串的剩余部分。

这是它的样子的骨架:

parse :: String -> (String, Expr)
parse (' ':more) = parse more
parse ('-':more) = let (remainder, e) = parse more
                   in (remainder, Sub e)
parse ('+':more) = undefined -- TODO
parse ('*':more) = undefined -- TODO
parse s@(num:more) | isDigit num = parseNumber s
parse s = error ("unexpected input: " ++ s)

parseNumber :: String -> (String, Expr)
parseNumber s = undefined