Parsing 如何解析同时也是运算符的关键字

Parsing 如何解析同时也是运算符的关键字,parsing,haskell,parsec,Parsing,Haskell,Parsec,我正在尝试使用parsec解析以下代码 for x = Int in [1, 2, 3] print x + 1 示例中唯一难以理解的部分是x=Int,这意味着变量x被定义为Int。语法上,这里有一个表达式。它也可以替换为返回类型的函数调用 到目前为止,我已经能够解析所有简单的文本和运算符。我现在的问题是,在这种语言中,in既是一个关键字,也是一个运算符,而类型(Int)是像任何其他对象一样的对象(可以是列表中的)。例如,以下代码完全有效,并打印false print (Int in

我正在尝试使用parsec解析以下代码

for x = Int in [1, 2, 3]
    print x + 1
示例中唯一难以理解的部分是
x=Int
,这意味着变量
x
被定义为
Int
。语法上,这里有一个表达式。它也可以替换为返回类型的函数调用

到目前为止,我已经能够解析所有简单的文本和运算符。我现在的问题是,在这种语言中,
in
既是一个关键字,也是一个运算符,而类型(
Int
)是像任何其他对象一样的对象(可以是列表中的
)。例如,以下代码完全有效,并打印
false

print (Int in [1, 2, 3])

所以现在我的解析器正确地解析x=
,然后将[1,2,3]
中的
Int解析为一个表达式。如何使
for
解析器在
中抓取
,而不是将其留给
表达式
解析器?我觉得parsec内置了类似的东西,但我不知道如何找到它

编辑:我更改了示例以使其更有意义

编辑:我在很多地方都遇到这种困难,语言非常复杂。另一个例子是
else
操作符,如果第一个参数为null,则返回第二个参数:

print (if true then (null else "hello") else "world")
# >> hello
print (if true then null else "hello" else "world")
# >> world

非常感谢@talex和@n.m.为我指明了我必须寻找的地方。我就是这样解决这个具体问题的:

我用一个“弹出”字列表和它下面的每个相关解析器(特别是
双操作符
解析器)参数化了
表达式
解析器(必须启用
{-#LANGUAGE FlexibleContexts}

 expression :: [String] -> MyParser AST 

 binOperator :: [String] -> MyParser AST
如果在二进制运算符的位置遇到一个“弹出”字,则
binOperator
解析器将失败(并且使用基于
chainl1
的解析器读取二进制操作),从而将“弹出”字(在本例中是
in
)留给
解析器使用。这应该与
if
解析器同样有效


我只是不把弹出词传递给
paren
解析器,所以
(以及类似的解析器,如list)之间没有可识别的弹出词。

我不明白<[1,2,3]
中的code>Int是表达式。你的问题是什么?
Int在[1,2,3]
中是一个表达式(其中
in
是一个二进制运算符),就像
1+2
是一个表达式一样。因此表达式解析器成功了。但是它不应该在
中作为运算符“eat”
,因为在本例中,它作为关键字属于
循环的
。一个用于二进制运算符,另一个用于
运算符中的
?那么我不明白将[1,2,3]
中的
Int解析为表达式有什么错。它是符合语法的表达式。解决此问题的最简单方法是将
for
的语法更改为
for\u关键字~variable\u name~assign\u token~expr
,然后验证表达式是否在
表达式中。如果你不喜欢这个想法,你必须发布你的代码,因为如果没有代码本身,很难知道如何修复代码。