Haskell -- 解析器组合器关键字
Haskell -- parser combinators keywords
我正在使用解析器组合器在 Haskell 中构建解析器。我在解析 "while"、"true"、"if" 等
等关键字时遇到问题
所以我面临的问题是,在关键字之后要求有一个分隔符或白色space,例如在声明中
if cond then stat1 else stat2 fi;x = 1
使用此语句,所有关键字前面都有 space 或分号。但是在不同的情况下可以有不同的分隔符。
目前我实现如下:
keyword :: String -> Parser String
keyword k = do
kword <- leadingWS (string k)
check (== ';') <|> check isSpace <|> check (== ',') <|> check (== ']')
junk
return word
然而,这个关键字解析器的问题在于它会允许包含 if 语句的程序; cond 然后 stat1 else stat2 fi
我们尝试将 (Char -> Bool) 传递给关键字,然后将其传递给检查。但这行不通,因为我们在解析关键字时不知道允许使用哪种分隔符。
我想知道是否可以就此问题提供帮助?
不要尝试处理 keyword
中的分隔符,但您需要确保 keyword "if"
不会与标识符 "iffy" 混淆(请参阅 sepp2k 的评论)。
keyword :: String -> Parser String
keyword k = leadingWS $ try (do string k
notFollowedBy alphanum)
语句的分隔符处理方式如下:
statements = statement `sepBy` semi
statement = ifStatement <|> assignmentStatement <|> ...
我正在使用解析器组合器在 Haskell 中构建解析器。我在解析 "while"、"true"、"if" 等
等关键字时遇到问题所以我面临的问题是,在关键字之后要求有一个分隔符或白色space,例如在声明中
if cond then stat1 else stat2 fi;x = 1
使用此语句,所有关键字前面都有 space 或分号。但是在不同的情况下可以有不同的分隔符。
目前我实现如下:
keyword :: String -> Parser String
keyword k = do
kword <- leadingWS (string k)
check (== ';') <|> check isSpace <|> check (== ',') <|> check (== ']')
junk
return word
然而,这个关键字解析器的问题在于它会允许包含 if 语句的程序; cond 然后 stat1 else stat2 fi
我们尝试将 (Char -> Bool) 传递给关键字,然后将其传递给检查。但这行不通,因为我们在解析关键字时不知道允许使用哪种分隔符。
我想知道是否可以就此问题提供帮助?
不要尝试处理 keyword
中的分隔符,但您需要确保 keyword "if"
不会与标识符 "iffy" 混淆(请参阅 sepp2k 的评论)。
keyword :: String -> Parser String
keyword k = leadingWS $ try (do string k
notFollowedBy alphanum)
语句的分隔符处理方式如下:
statements = statement `sepBy` semi
statement = ifStatement <|> assignmentStatement <|> ...