Nano Hash - криптовалюты, майнинг, программирование

Как создать данные парсера?

Я пытаюсь узнать, как сделать анализатор выражений в Haskell, и я нашел этот код (ниже), но я даже не знаю, как его использовать.

Я пробовал с: expr (Add (Num 5) (Num 2)) , но ему нужен тип данных «Парсер».

import Text.Parsec
import Text.Parsec.String
import Text.Parsec.Expr
import Text.Parsec.Token
import Text.Parsec.Language

data Expr = Num Int | Var String | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr deriving Show

expr :: Parser Expr
expr = buildExpressionParser table factor
  <?> "expression"
table = [[op "*" Mul AssocLeft, op "/" Div AssocLeft],
      [op "+" Add AssocLeft, op "-" Sub AssocLeft]]
      where
        op s f assoc = Infix (do{ string s; return f}) assoc
factor = do{ char '('
        ; x <- expr
        ; char ')'
        ; return x}
    <|> number
    <|> variable
    <?> "simple expression"
number :: Parser Expr
number = do{ ds<- many1 digit
      ; return (Num (read ds))}
  <?> "number"
variable :: Parser Expr
variable = do{ ds<- many1 letter
        ; return (Var ds)}
  <?> "variable"

Решение: ввод readExpr = проанализировать ввод expr «имя сообщения об ошибке» и использовать readExpr.

26.05.2013

Ответы:


1

Вы можете использовать функцию parse, которая будет запускать Parser для входной строки и возвращать Either ParseError Expr. Я привел простое использование ниже, где я превращаю это ParseError в строку и передаю ее дальше

readExpr :: String -> Either String Expr
readExpr input = case parse expr "name for error messages" input of
   Left err -> Left $ "Oh noes parsers are failing: " ++ show err -- Handle error
   Right a  -> Right a -- Handle success

Есть несколько других функций, таких как parseFromFile, которые позволяют сократить несколько общих шаблонов, чтобы найти их, проверьте parsec пища

26.05.2013
  • Я думаю, что это должно быть правильно?? 26.05.2013
  • Нет, я подаю его во что-то, что также возвращает Either. Я бы закончил тем, что написал Right a -> Right a 26.05.2013
  • @jozefg: Нет, он прав. ParseError и String — это разные типы, поэтому вам нужно написать Right a -> Right a, чтобы изменить тип с Either ParseError Expr на Either String Expr. В противном случае он не будет проверять тип. 26.05.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..