Parsing Haskell:如何将语义空格集成到解析器中?

Parsing Haskell:如何将语义空格集成到解析器中?,parsing,haskell,Parsing,Haskell,我目前正在用Haskell编写一种语言,https://github.com/EdONeill1/HENRYGCL,我很难弄清楚如何允许在多行上编写程序。进行以下循环,将1加到x上,直到达到10 Henry > x := 1 Henry > if <x<10> [] x := <x+1> [] x := <x+10> 尝试以下操作时,我收到以下错误: Henry > x:=1 1 Henry > if <x<10&g

我目前正在用Haskell编写一种语言,
https://github.com/EdONeill1/HENRYGCL
,我很难弄清楚如何允许在多行上编写程序。进行以下循环,将1加到x上,直到达到10

Henry > x := 1
Henry > if <x<10> [] x := <x+1> [] x := <x+10>
尝试以下操作时,我收到以下错误:

Henry > x:=1
1
Henry > if <x<10>
Parse error at "Henry" (line 1, column 10):
unexpected end of input
expecting space or lf new-line
Henry > if <x<10>
Parse error at "Henry" (line 1, column 12):
unexpected end of input
expecting space, lf new-line or "[]"
Henry >
Henry>x:=1
1.
如果
第一个错误是在我输入完
后按Enter键引起的,第二个错误是在按空格键后按Enter键引起的。在这两种情况下,换行符都没有被更正。我也不确定
lf
中的
lf
到底是什么意思,因为据我所知,按回车键不应该给你换行吗


在代码的另一部分中,我有以下内容,
whiteSpace=Token.whitespacelexer
。当我用这个替换
some(空格换行)
并在
if之后按enter键时,解析器看起来很好。这里的问题是,
main
当前一次只在一行上运行解析器。在运行解析器之前,您需要累积整个输入。

我不确定是否理解您的意思。你的意思是,因为在
readPrompt
函数中,我有
getLine
,所以所有内容都包含在一行中,不能输入多行?没错,在调用
evalAndPrint
之前,您需要连接多个
getLine
的结果。使用函数
getContents
是否有任何好处?关于
readPrompt
,当我尝试像这样连接
getLine
时:
readPrompt=flushsstr prompt>>getLine>>getLine
,第一个
getLine
被忽略。我知道这是由于
>
的性质造成的,但是我很难想出一种方法来连接
readPrompt
中的
getLine
,除非我创建了一个获取多个getLine的函数。因此,它看起来像是使用一个只包含任意数量的
getLine
函数的函数。我只需要弄清楚如何添加它,这样它就可以适用于任意长度的任何程序。谢谢你的帮助
getContents
将获取程序将接受的所有输入,因此它不适用于REPL,在REPL中,您希望在每个命令后将控件返回给用户。
ifStmt :: Parser HenryVal
ifStmt =
  do 
     reserved "if"
     cond  <- bExpression <|>
              do 
                _ <- char '<'
                x <- try parseBinary
                _ <- char '>'
                return x
    some (space <|> newline)
    reserved "[]"
    stmt1 <- statement
    some (space <|> newline)
    reserved " []"
    stmt2 <- statement
    return $ If cond stmt1 stmt2
Henry > x:=1
1
Henry > if <x<10>
Parse error at "Henry" (line 1, column 10):
unexpected end of input
expecting space or lf new-line
Henry > if <x<10>
Parse error at "Henry" (line 1, column 12):
unexpected end of input
expecting space, lf new-line or "[]"
Henry >