SlideShare a Scribd company logo
8   :
    ruicc (ruicc.rail@gmail.com)
•        (             )

•@ruicc
•http://d.hatena.ne.jp/ruicc
•LinkThink ! Altplus
Haskell 8
•   Google Suggest
•Haskell
P.90 †2[        ]
•

    Web
                     10
P.90 †2[        ]
•

    Web
                     10
P.90 †2[   ]
P.90 †2[   ]
P.90 †2[                 ]

•              =>

•   import Prelude hiding(return,(>>=),(>>))

•   do         (Mona*                      )

•
•
•
•Haskell
•
 •   *

•
•advanced   :
•
•Parser   [pärsəәr]

•
“-32.4”   Parser   -32.4
Programming Haskell Chapter8
•

type Parser = String -> Tree


                  ※Tree
•


type Parser = String -> (Tree, String)
•


type Parser = String -> [(Tree, String)]
•                          a




type Parser a = String -> [(a, String)]

   ※
                            advanced:
•

“1.4aaa”   Parser   [(1.4,“aaa”)]
•

“+.4aaa”   Parser   []
• return    :: a -> Parser a

 •
• failure    :: Parser a

 •
• item   :: Parser Char

 •
parse
• Parser   String

   • Parser
  parse:: Parser a -> String -> [(a,String)]
parse
  •parse

“1.4aaa”     Parser       [(1.4,“aaa”)]


           parse      !
“-3.24”    sign    [(‘-’,“3.24”)]



“3.24”    digits   [(“3”,“.24”)]



“.24”     point    [(‘.’,“24”)]
•
•
    •
    •
sign


            digits
“-3.24”              [(-3.24,“”)]
            point
parse   1
            digits
                       ※
•
 •
•p,   then q

               double

                 =
digits   >>= point >>=   digits

                           ※
•                     (>>=)

                               p
(>>=):: Parser a -> (a -> Parser b) -> Parser b
p >>= f = inp -> case parse p inp of
                   [] -> []
                   [(v,out)] -> parse (f v) out


                                   (f v)
•p,   or q

                 char ‘+’


  sign       =     +++


                 char ‘-’
•
                          p
(+++):: Parser a -> Parser a -> Parser a
p +++ q = inp -> case parse p inp of
                   [] -> parse q inp
                   [(v,out)] -> [(v,out)]

                                        q
              advanced:           p
“-3.24”    sign    [(‘-’,“3.24”)]



“3.24”    digits   [(“3”,“.24”)]



“.24”     point    [(‘.’,“24”)]
“-3.24”    sign    [(‘-’,“3.24”)]



“3.24”    digits   [(“3”,“.24”)]



“.24”     point    [(‘.’,“24”)]
“-3.24”    sign    [(‘-’,“3.24”)]



“3.24”    digits   [(“3”,“.24”)]



“.24”     point    [(‘.’,“24”)]
•         (>>=)
double =
  sign     >>= s    ->
  digits   >>= num ->
  point    >>= p    ->
  digits   >>= num2 ->
  return   (func s num p num2)

             ※sign,digits,point   given
•     return
double =
  sign     >>= s    ->
  digits   >>= num ->
  point    >>= p    ->
  digits   >>= num2 ->
  return   (func s num p num2)
do
 •        Parser
double :: Parser Double
double = do
    s    <- sign
    num <- digits
    p    <- point
    num2 <- digits
    return (func s num p num2)
• type Parser a = String -> [(a, String)]
 •          Char

 • Parser            a

 • Parser
do
      •
    double :: Parser Double
    double = do
 Char   s    <- sign   :: Parser Char
        num <- digits :: Parser String
String
        p    <- point :: Parser Char
 Char   num2 <- digits :: Parser String
String return (func s num p num2) :: Parser Double
do

•
•
•           String

•   (>>=)
sign


          digits
“-3.24”            [(-3.24,“”)]
          point


          digits
• return, failure,   item

•     (>>=)

•     (+++)

• (do )
•
•   (>>=)

•   (+++)

•   (   )
Programming Haskell Chapter8
• item                          sat

             item
sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
            if p x then return x else failure


     (p x)    True            False
                               ※p   predicate
• sat
  digit    = sat isDigit
  lower    = sat isLower

  upper    = sat isUpper
  letter   = sat isAlpha

  alphanum = sat isAlphanum
  char x   = sat (==x)
• char                  string

  string :: String -> Parser String
  string []     = return []
  string (x:xs) = do char x
                     string xs
                     return (x:xs)
•                           many, many1

    many, many1 :: Parser a -> Parser [a]

    many p   = many1 p +++ return []

    many1 p = do v <- p

                  vs <- many p

                  return (v:vs)
• many
  ident = do x <- lower
              xs <- many alphanum
              return (x:xs)
  nat    = do xs <- many1 digit
              return (read xs)
  space = do many (sat isSpace)
              return ()
•
    token :: Parser a -> Parser a
    token p = do space
                 v <- p
                 space
                 return v
• token
  identifier :: Parser String
  identifier = token ident
  natural :: Parser Int
  natural = token nat
  symbol :: Parser String
  symbol xs = token (string xs)
•
:

•BNF(Backus-Naur   Form)

 •
 • (|)                     (   )
•                                     BNF..?

    expr ::= expr ‘+’ expr

            | expr ‘*’ expr

            | ‘(‘ expr ‘)’

            | nat

    nat   ::= ‘0’ | ‘1’ | ‘2’ | ...
•(*)      (+)

•
 • (expr), (term),   (factor)
•                       BNF

    expr   ::= expr ‘+’ expr | term

    term   ::= term ‘*’ term | factor

    factor ::= ‘(‘ expr ‘)’ | nat

    nat    ::= ‘0’ | ‘1’ | ‘2’ | ...
•
•1   + 2 + 3 == 1 + (2 + 3)

•
•1   - 2 - 3 == (1 - 2) - 3

•
•                     BNF(             )

    expr   ::= term ‘+’ expr | term

    term   ::= factor ‘*’ term | factor

    factor ::= ‘(‘ expr ‘)’ | nat

    nat    ::= ‘0’ | ‘1’ | ‘2’ | ...
•                     BNF(            )

    expr   ::= term ‘+’ expr | term

    term   ::= factor ‘*’ term | factor




                →
•BNF                                   1
 -- expr ::= term ‘+’ expr | term
 expr :: Parser Int
 expr = do t <- (term :: Parser Int)
           symbol “+”
           e <- (expr :: Parser Int)
           return (t + e)
     +++ term
•BNF                                     2
 -- term ::= factor ‘*’ term | factor
 term :: Parser Int
 term = do f <- (factor :: Parser Int)
           symbol “*”
           t <- (term :: Parser Int)
           return (f * t)
     +++ factor
•BNF                                     3
 -- factor ::= ‘(‘ expr ‘)’ | nat
 factor :: Parser Int
 factor = do symbol “(“
             e <- (expr :: Parser Int)
             symbol “)”
             return e
       +++ natural
•                    expr
    ghci> parse expr "5 * (2) +   ( 4   +(2 * 2 + 4) * 2)   * 5 "
    [(110,””)]
Haskell
Parser
Package

•Parsec3
 •
•attoparsec
 •
•
    • letter,    digit, char, string, many, ...
•      (+++)              (<|>), try

    •
    • import    Control.Applicative (<|>)
    •               try
BNF
  BNF         BNF       (wikipedia       )

<syntax> ::= <rule> | <rule> <syntax>
<rule> ::= <opt-whitespace> "<" <rule-name> ">" <opt-whitespace> "::="
           <opt-whitespace> <expression> <line-end>
<opt-whitespace> ::= " " <opt-whitespace> | ""
<expression> ::= <list> | <list> "|" <expression>
<line-end> ::= <opt-whitespace> <eol> | <line-end> <line-end>
<list> ::= <term> | <term> <opt-whitespace> <list>
<term> ::= <literal> | "<" <rule-name> ">"
<literal> ::= '"' <text> '"' | "'" <text> "'"
cabal install attoparsec
cabal install attoparsec-text
{-# LANGUAGE OverloadedStrings #-}
module BNFParser where
import Data.Attoparsec.Text
import Data.Text.Internal (Text)
import Data.Text as T
import Control.Applicative hiding(many)
BNF
type BNF = Syntax
type Syntax = [Rule]
data Rule = Rule Text Expr
type Expr = [List]
type List = [Term]
data Term = Lit Text | RuleName Text
BNF                      (10          !)
syntax = many1 rule
rule = Rule <$> (spaces *> "<" .*> text '>' <*. ">") <* spaces
     <* string "::=" <* spaces <*> expression <* line_end
spaces = T.pack <$> many (char ' ')
expression = sepBy1 list (spaces *> string "|" <* spaces)
line_end = many1 $ spaces *> endOfLine
list = sepBy1 term spaces
term = Lit <$> literal <|> RuleName <$> "<" .*> text '>' <*. ">"
literal = "'" .*> text ''' <*. "'" <|> """ .*> text '"' <*. """
text c = takeTill (==c)
3

Haskell
Parser
BNF
syntax = many1 rule
rule = Rule <$> (spaces *> "<" .*> text '>' <*. ">") <* spaces
     <* string "::=" <* spaces <*> expression <* line_end
spaces = T.pack <$> many (char ' ')
expression = sepBy1 list (spaces *> string "|" <* spaces)
line_end = many1 $ spaces *> endOfLine
list = sepBy1 term spaces
term = Lit <$> literal <|> RuleName <$> "<" .*> text '>' <*. ">"
literal = "'" .*> text ''' <*. "'" <|> """ .*> text '"' <*. """
text c = takeTill (==c)
3
Haskell


Mona*,Applicative,
Functor,Arrow,...
Happy Hacking Parser
in Haskell!

More Related Content

PPTX
P2 2017 python_strings
PPTX
P3 2017 python_regexes
PDF
Combinator parsing
PDF
20170509 rand db_lesugent
PPTX
2017 biological databasespart2
KEY
関数潮流(Function Tendency)
PDF
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
PDF
The Ring programming language version 1.9 book - Part 31 of 210
P2 2017 python_strings
P3 2017 python_regexes
Combinator parsing
20170509 rand db_lesugent
2017 biological databasespart2
関数潮流(Function Tendency)
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
The Ring programming language version 1.9 book - Part 31 of 210

What's hot (17)

PDF
The Ring programming language version 1.8 book - Part 29 of 202
PDF
The Ring programming language version 1.5.2 book - Part 24 of 181
PDF
Implementing virtual machines in go & c 2018 redux
PDF
Swift Study #2
PDF
The Ring programming language version 1.5.1 book - Part 21 of 180
PDF
The Ring programming language version 1.6 book - Part 26 of 189
PDF
The Ring programming language version 1.7 book - Part 26 of 196
PDF
Swift에서 꼬리재귀 사용기 (Tail Recursion)
PDF
SPL 13 | Character Array(String) in C
PDF
Investigating Python Wats
PPTX
SPL - The Undiscovered Library - PHPBarcelona 2015
PPT
Groovy unleashed
PDF
Beginning Haskell, Dive In, Its Not That Scary!
PDF
2 BytesC++ course_2014_c4_ arrays
PDF
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
KEY
Template Haskell とか
PDF
Gareth hayes. non alphanumeric javascript-php and shared fuzzing
The Ring programming language version 1.8 book - Part 29 of 202
The Ring programming language version 1.5.2 book - Part 24 of 181
Implementing virtual machines in go & c 2018 redux
Swift Study #2
The Ring programming language version 1.5.1 book - Part 21 of 180
The Ring programming language version 1.6 book - Part 26 of 189
The Ring programming language version 1.7 book - Part 26 of 196
Swift에서 꼬리재귀 사용기 (Tail Recursion)
SPL 13 | Character Array(String) in C
Investigating Python Wats
SPL - The Undiscovered Library - PHPBarcelona 2015
Groovy unleashed
Beginning Haskell, Dive In, Its Not That Scary!
2 BytesC++ course_2014_c4_ arrays
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
Template Haskell とか
Gareth hayes. non alphanumeric javascript-php and shared fuzzing
Ad

Viewers also liked (13)

PPT
Algorithms Vs Meta Language
PDF
Control structure
PDF
Subprogram
KEY
Programming haskell chapter10
PPTX
Meta Languages Bnf Ebnf Student Version
PPT
NS2: Binding C++ and OTcl variables
PPTX
Normal forms cfg
PPTX
Scope - Static and Dynamic
PDF
Principles of programming languages. Detail notes
PDF
Bus tracking application project report
PPT
Bus Tracking Application in Android
PPTX
Bus tracking application in Android
PDF
Variables: names, bindings, type, scope
Algorithms Vs Meta Language
Control structure
Subprogram
Programming haskell chapter10
Meta Languages Bnf Ebnf Student Version
NS2: Binding C++ and OTcl variables
Normal forms cfg
Scope - Static and Dynamic
Principles of programming languages. Detail notes
Bus tracking application project report
Bus Tracking Application in Android
Bus tracking application in Android
Variables: names, bindings, type, scope
Ad

Similar to Programming Haskell Chapter8 (20)

PDF
Learning notes of r for python programmer (Temp1)
PDF
An overview of Python 2.7
PDF
A tour of Python
PPTX
하스켈 프로그래밍 입문 3
KEY
Haskell for Scala-ists
PPTX
P3 2018 python_regexes
ODP
PDF
Brief tour of psp-std
KEY
Invertible-syntax 入門
PDF
Free Monads Getting Started
PDF
Data Analysis and Programming in R
PPTX
GE8151 Problem Solving and Python Programming
PPTX
Python String Revisited.pptx
DOCX
Advanced Data Visualization in R- Somes Examples.
PPTX
datastrubsbwbwbbwcturesinpython-3-4.pptx
KEY
Haskellで学ぶ関数型言語
PDF
R for you
PPTX
Python Programming for basic beginners.pptx
PPTX
Datastructures in python
PDF
1 pythonbasic
Learning notes of r for python programmer (Temp1)
An overview of Python 2.7
A tour of Python
하스켈 프로그래밍 입문 3
Haskell for Scala-ists
P3 2018 python_regexes
Brief tour of psp-std
Invertible-syntax 入門
Free Monads Getting Started
Data Analysis and Programming in R
GE8151 Problem Solving and Python Programming
Python String Revisited.pptx
Advanced Data Visualization in R- Somes Examples.
datastrubsbwbwbbwcturesinpython-3-4.pptx
Haskellで学ぶ関数型言語
R for you
Python Programming for basic beginners.pptx
Datastructures in python
1 pythonbasic

More from Kousuke Ruichi (6)

PDF
grpc-haskell.pdf
PDF
並行プログラミングと継続モナド
PDF
An engineer uses monads
PDF
Purescript with Monad
PDF
ゆるふわなHaskell話
KEY
Haskell Day2012 - 参照透過性とは何だったのか
grpc-haskell.pdf
並行プログラミングと継続モナド
An engineer uses monads
Purescript with Monad
ゆるふわなHaskell話
Haskell Day2012 - 参照透過性とは何だったのか

Recently uploaded (20)

PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
CIFDAQ's Market Wrap: Ethereum Leads, Bitcoin Lags, Institutions Shift
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Spectral efficient network and resource selection model in 5G networks
PPT
Teaching material agriculture food technology
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Cloud computing and distributed systems.
PDF
madgavkar20181017ppt McKinsey Presentation.pdf
PDF
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Chapter 2 Digital Image Fundamentals.pdf
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PDF
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Sensors and Actuators in IoT Systems using pdf
PPTX
Big Data Technologies - Introduction.pptx
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
CIFDAQ's Market Wrap: Ethereum Leads, Bitcoin Lags, Institutions Shift
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
MYSQL Presentation for SQL database connectivity
Spectral efficient network and resource selection model in 5G networks
Teaching material agriculture food technology
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
NewMind AI Weekly Chronicles - August'25 Week I
Cloud computing and distributed systems.
madgavkar20181017ppt McKinsey Presentation.pdf
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Chapter 2 Digital Image Fundamentals.pdf
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...
20250228 LYD VKU AI Blended-Learning.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Sensors and Actuators in IoT Systems using pdf
Big Data Technologies - Introduction.pptx

Programming Haskell Chapter8

  • 1. 8 : ruicc ([email protected])
  • 2. ( ) •@ruicc •http://d.hatena.ne.jp/ruicc •LinkThink ! Altplus
  • 3. Haskell 8 • Google Suggest
  • 5. P.90 †2[ ] • Web 10
  • 6. P.90 †2[ ] • Web 10
  • 9. P.90 †2[ ] • => • import Prelude hiding(return,(>>=),(>>)) • do (Mona* ) •
  • 11. • • * • •advanced :
  • 12.
  • 13. •Parser [pärsəәr] •
  • 14. “-32.4” Parser -32.4
  • 16. • type Parser = String -> Tree ※Tree
  • 17. • type Parser = String -> (Tree, String)
  • 18. • type Parser = String -> [(Tree, String)]
  • 19. a type Parser a = String -> [(a, String)] ※ advanced:
  • 20. • “1.4aaa” Parser [(1.4,“aaa”)]
  • 21. • “+.4aaa” Parser []
  • 22. • return :: a -> Parser a • • failure :: Parser a • • item :: Parser Char •
  • 23. parse • Parser String • Parser parse:: Parser a -> String -> [(a,String)]
  • 24. parse •parse “1.4aaa” Parser [(1.4,“aaa”)] parse !
  • 25. “-3.24” sign [(‘-’,“3.24”)] “3.24” digits [(“3”,“.24”)] “.24” point [(‘.’,“24”)]
  • 26. • • • •
  • 27. sign digits “-3.24” [(-3.24,“”)] point parse 1 digits ※
  • 29. •p, then q double = digits >>= point >>= digits ※
  • 30. (>>=) p (>>=):: Parser a -> (a -> Parser b) -> Parser b p >>= f = inp -> case parse p inp of [] -> [] [(v,out)] -> parse (f v) out (f v)
  • 31. •p, or q char ‘+’ sign = +++ char ‘-’
  • 32. p (+++):: Parser a -> Parser a -> Parser a p +++ q = inp -> case parse p inp of [] -> parse q inp [(v,out)] -> [(v,out)] q advanced: p
  • 33. “-3.24” sign [(‘-’,“3.24”)] “3.24” digits [(“3”,“.24”)] “.24” point [(‘.’,“24”)]
  • 34. “-3.24” sign [(‘-’,“3.24”)] “3.24” digits [(“3”,“.24”)] “.24” point [(‘.’,“24”)]
  • 35. “-3.24” sign [(‘-’,“3.24”)] “3.24” digits [(“3”,“.24”)] “.24” point [(‘.’,“24”)]
  • 36. (>>=) double = sign >>= s -> digits >>= num -> point >>= p -> digits >>= num2 -> return (func s num p num2) ※sign,digits,point given
  • 37. return double = sign >>= s -> digits >>= num -> point >>= p -> digits >>= num2 -> return (func s num p num2)
  • 38. do • Parser double :: Parser Double double = do s <- sign num <- digits p <- point num2 <- digits return (func s num p num2)
  • 39. • type Parser a = String -> [(a, String)] • Char • Parser a • Parser
  • 40. do • double :: Parser Double double = do Char s <- sign :: Parser Char num <- digits :: Parser String String p <- point :: Parser Char Char num2 <- digits :: Parser String String return (func s num p num2) :: Parser Double
  • 41. do • • • String • (>>=)
  • 42. sign digits “-3.24” [(-3.24,“”)] point digits
  • 43. • return, failure, item • (>>=) • (+++) • (do )
  • 44. • • (>>=) • (+++) • ( )
  • 46. • item sat item sat :: (Char -> Bool) -> Parser Char sat p = do x <- item if p x then return x else failure (p x) True False ※p predicate
  • 47. • sat digit = sat isDigit lower = sat isLower upper = sat isUpper letter = sat isAlpha alphanum = sat isAlphanum char x = sat (==x)
  • 48. • char string string :: String -> Parser String string [] = return [] string (x:xs) = do char x string xs return (x:xs)
  • 49. many, many1 many, many1 :: Parser a -> Parser [a] many p = many1 p +++ return [] many1 p = do v <- p vs <- many p return (v:vs)
  • 50. • many ident = do x <- lower xs <- many alphanum return (x:xs) nat = do xs <- many1 digit return (read xs) space = do many (sat isSpace) return ()
  • 51. token :: Parser a -> Parser a token p = do space v <- p space return v
  • 52. • token identifier :: Parser String identifier = token ident natural :: Parser Int natural = token nat symbol :: Parser String symbol xs = token (string xs)
  • 53.
  • 54. : •BNF(Backus-Naur Form) • • (|) ( )
  • 55. BNF..? expr ::= expr ‘+’ expr | expr ‘*’ expr | ‘(‘ expr ‘)’ | nat nat ::= ‘0’ | ‘1’ | ‘2’ | ...
  • 56. •(*) (+) • • (expr), (term), (factor)
  • 57. BNF expr ::= expr ‘+’ expr | term term ::= term ‘*’ term | factor factor ::= ‘(‘ expr ‘)’ | nat nat ::= ‘0’ | ‘1’ | ‘2’ | ...
  • 58. • •1 + 2 + 3 == 1 + (2 + 3) • •1 - 2 - 3 == (1 - 2) - 3 •
  • 59. BNF( ) expr ::= term ‘+’ expr | term term ::= factor ‘*’ term | factor factor ::= ‘(‘ expr ‘)’ | nat nat ::= ‘0’ | ‘1’ | ‘2’ | ...
  • 60. BNF( ) expr ::= term ‘+’ expr | term term ::= factor ‘*’ term | factor →
  • 61. •BNF 1 -- expr ::= term ‘+’ expr | term expr :: Parser Int expr = do t <- (term :: Parser Int) symbol “+” e <- (expr :: Parser Int) return (t + e) +++ term
  • 62. •BNF 2 -- term ::= factor ‘*’ term | factor term :: Parser Int term = do f <- (factor :: Parser Int) symbol “*” t <- (term :: Parser Int) return (f * t) +++ factor
  • 63. •BNF 3 -- factor ::= ‘(‘ expr ‘)’ | nat factor :: Parser Int factor = do symbol “(“ e <- (expr :: Parser Int) symbol “)” return e +++ natural
  • 64. expr ghci> parse expr "5 * (2) + ( 4 +(2 * 2 + 4) * 2) * 5 " [(110,””)]
  • 67. • letter, digit, char, string, many, ... • (+++) (<|>), try • • import Control.Applicative (<|>) • try
  • 68. BNF BNF BNF (wikipedia ) <syntax> ::= <rule> | <rule> <syntax> <rule> ::= <opt-whitespace> "<" <rule-name> ">" <opt-whitespace> "::=" <opt-whitespace> <expression> <line-end> <opt-whitespace> ::= " " <opt-whitespace> | "" <expression> ::= <list> | <list> "|" <expression> <line-end> ::= <opt-whitespace> <eol> | <line-end> <line-end> <list> ::= <term> | <term> <opt-whitespace> <list> <term> ::= <literal> | "<" <rule-name> ">" <literal> ::= '"' <text> '"' | "'" <text> "'"
  • 69. cabal install attoparsec cabal install attoparsec-text
  • 70. {-# LANGUAGE OverloadedStrings #-} module BNFParser where import Data.Attoparsec.Text import Data.Text.Internal (Text) import Data.Text as T import Control.Applicative hiding(many)
  • 71. BNF type BNF = Syntax type Syntax = [Rule] data Rule = Rule Text Expr type Expr = [List] type List = [Term] data Term = Lit Text | RuleName Text
  • 72. BNF (10 !) syntax = many1 rule rule = Rule <$> (spaces *> "<" .*> text '>' <*. ">") <* spaces <* string "::=" <* spaces <*> expression <* line_end spaces = T.pack <$> many (char ' ') expression = sepBy1 list (spaces *> string "|" <* spaces) line_end = many1 $ spaces *> endOfLine list = sepBy1 term spaces term = Lit <$> literal <|> RuleName <$> "<" .*> text '>' <*. ">" literal = "'" .*> text ''' <*. "'" <|> """ .*> text '"' <*. """ text c = takeTill (==c)
  • 74. BNF syntax = many1 rule rule = Rule <$> (spaces *> "<" .*> text '>' <*. ">") <* spaces <* string "::=" <* spaces <*> expression <* line_end spaces = T.pack <$> many (char ' ') expression = sepBy1 list (spaces *> string "|" <* spaces) line_end = many1 $ spaces *> endOfLine list = sepBy1 term spaces term = Lit <$> literal <|> RuleName <$> "<" .*> text '>' <*. ">" literal = "'" .*> text ''' <*. "'" <|> """ .*> text '"' <*. """ text c = takeTill (==c)
  • 75. 3

Editor's Notes