Haskell Text.parsercompbinators
我想为Haskell中的正则表达式创建一个解析器组合器。因此,我定义了自己的数据类型,并为此类型创建了一个匹配函数。我最近发现了Text.parsercompbinators。如果使用Haskell Text.parsercompbinators,haskell,Haskell,我想为Haskell中的正则表达式创建一个解析器组合器。因此,我定义了自己的数据类型,并为此类型创建了一个匹配函数。我最近发现了Text.parsercompbinators。如果使用parseTest函数,则结果类型为IO。那么,如何使用Text.parsercompbinators返回所创建数据的类型呢?下面是我的代码 data Reg = Eps |Sym Char --caracter |Alt Reg Reg --a sau b a|b
parseTest
函数,则结果类型为IO
。那么,如何使用Text.parsercompbinators返回所创建数据的类型呢?下面是我的代码
data Reg = Eps
|Sym Char --caracter
|Alt Reg Reg --a sau b a|b
|Seq Reg Reg -- secventa ab sau chiar paranteza
|Rep (Int, Maybe Int) Reg --Star repet on or more time
|Dif Reg --not
deriving (Show)
--match function
accept :: Reg -> String ->Bool
accept ( parse term "abcd") "abcd"
ERROR - Type error in application
*** Expression : accept (parse term "abcd") "abcd"
*** Term : parse term "abcd"
*** Type : [Char] -> Either ParseError Reg
*** Does not match : Reg
--term is the Parser function where the grammars is defined
term :: Parser Reg
term = buildExpressionParser ops atom where
正如sdcvvc在评论中指出的那样,
parse
没有应用到足够的参数。Parsec的表达式解析器为算术表达式(如“1+2”等)意义上的“表达式”和编程语言中的表达式(而非语句)建立一个解析表。不是所有的regexp操作符都是后缀吗?如果是这样,你最好使用另一种技术。实际上,regexp的alt
当然是中缀。但是,您可能仍然会发现,对于这个问题,使用内置表达式解析器并不像自己这么容易。parse
需要额外的参数-源文件的名称。如果你不在乎的话,你可以给它”
。它将返回ParseError Reg
,然后您可以在左/右方向进行模式匹配。