Parsing 如何解析同时也是运算符的关键字
我正在尝试使用parsec解析以下代码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
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
,然后验证表达式是否在表达式中。如果你不喜欢这个想法,你必须发布你的代码,因为如果没有代码本身,很难知道如何修复代码。