module Graphics.Implicit.ExtOpenScad.Parser.Util where
import Graphics.Implicit.Definitions
import Text.ParserCombinators.Parsec hiding (State)
import Text.ParserCombinators.Parsec.Expr
import Graphics.Implicit.ExtOpenScad.Definitions
genSpace = many $
oneOf " \t\n\r"
<|> (try $ do
string "//"
many ( noneOf "\n")
string "\n"
return ' '
) <|> (try $ do
string "/*"
manyTill anyChar (try $ string "*/")
return ' '
)
pad parser = do
genSpace
a <- parser
genSpace
return a
tryMany = (foldl1 (<|>)) . (map try)
variableSymb = many1 (noneOf " ,|[]{}()+-*&^%#@!~`'\"\\/;:.,<>?=") <?> "variable"
patternMatcher :: GenParser Char st Pattern
patternMatcher =
(do
char '_'
return Wild
) <|> ( do
symb <- variableSymb
return $ Name symb
) <|> ( do
char '['
genSpace
components <- patternMatcher `sepBy` (try $ genSpace >> char ',' >> genSpace)
genSpace
char ']'
return $ ListP components
)