Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 如何在Haskell中构建解析器_Parsing_Haskell - Fatal编程技术网

Parsing 如何在Haskell中构建解析器

Parsing 如何在Haskell中构建解析器,parsing,haskell,Parsing,Haskell,这是我的用户定义数据类型。我想使用上述数据类型处理算术表达式,如(2+3*4-x),而不使用buildExpression解析器。我能做什么 请帮帮我,它应该能处理操作员优先权 假设我们想要构建一个addsub级解析器。我们想说的是(忽略正确值的实际返回,只关注原始解析) 这真的不管用。但我们可以把这个因素作为 addsub = muldiv >> oneOf "+-" >> muldiv 我们假设muldiv是一个仅用于乘法和除法的解析器,您可以用类似的方式编写它 也

这是我的用户定义数据类型。我想使用上述数据类型处理算术表达式,如
(2+3*4-x)
,而不使用
buildExpression
解析器。我能做什么


请帮帮我,它应该能处理操作员优先权

假设我们想要构建一个
addsub
级解析器。我们想说的是(忽略正确值的实际返回,只关注原始解析)

这真的不管用。但我们可以把这个因素作为

addsub = muldiv >> oneOf "+-" >> muldiv
我们假设
muldiv
是一个仅用于乘法和除法的解析器,您可以用类似的方式编写它

也就是说,不用语法

addsub = muldiv >> addsub'
addsub' = many $ oneOf "+-" >> muldiv
我们使用稍微复杂一点,但实际上可由Parsec使用:

addsub = addsub (+-) muldiv | muldiv

我们当然可以将后者重构成一个
many
,这给了我们一个要添加的表达式列表。然后,您可以将其转换为所需的任何形式,例如
(adda1(adda2(adda3))

假设我们要构建
addsub
级别的解析器。我们想说的是(忽略正确值的实际返回,只关注原始解析)

这真的不管用。但我们可以把这个因素作为

addsub = muldiv >> oneOf "+-" >> muldiv
我们假设
muldiv
是一个仅用于乘法和除法的解析器,您可以用类似的方式编写它

也就是说,不用语法

addsub = muldiv >> addsub'
addsub' = many $ oneOf "+-" >> muldiv
我们使用稍微复杂一点,但实际上可由Parsec使用:

addsub = addsub (+-) muldiv | muldiv

我们当然可以将后者重构成一个
many
,这给了我们一个要添加的表达式列表。然后,您可以将其转换为所需的任何形式,例如
(adda1(adda2(adda3))

假设我们要构建
addsub
级别的解析器。我们想说的是(忽略正确值的实际返回,只关注原始解析)

这真的不管用。但我们可以把这个因素作为

addsub = muldiv >> oneOf "+-" >> muldiv
我们假设
muldiv
是一个仅用于乘法和除法的解析器,您可以用类似的方式编写它

也就是说,不用语法

addsub = muldiv >> addsub'
addsub' = many $ oneOf "+-" >> muldiv
我们使用稍微复杂一点,但实际上可由Parsec使用:

addsub = addsub (+-) muldiv | muldiv

我们当然可以将后者重构成一个
many
,这给了我们一个要添加的表达式列表。然后,您可以将其转换为所需的任何形式,例如
(adda1(adda2(adda3))

假设我们要构建
addsub
级别的解析器。我们想说的是(忽略正确值的实际返回,只关注原始解析)

这真的不管用。但我们可以把这个因素作为

addsub = muldiv >> oneOf "+-" >> muldiv
我们假设
muldiv
是一个仅用于乘法和除法的解析器,您可以用类似的方式编写它

也就是说,不用语法

addsub = muldiv >> addsub'
addsub' = many $ oneOf "+-" >> muldiv
我们使用稍微复杂一点,但实际上可由Parsec使用:

addsub = addsub (+-) muldiv | muldiv

我们当然可以将后者重构成一个
many
,这给了我们一个要添加的表达式列表。然后,您可以将其转换为您想要的任何形式,例如
(adda1(adda2(adda3))

我们不能使用buildExpressionParser有什么原因吗?我想这意味着您正在使用parsec。你知道如何对语法进行左因子分析以使其实际有效吗?“
buildExpression
parser”可能指的是。我们不能使用buildExpressionParser有什么原因吗?我想这意味着您正在使用parsec。你知道如何对语法进行左因子分析以使其实际有效吗?“
buildExpression
parser”可能指的是。我们不能使用buildExpressionParser有什么原因吗?我想这意味着您正在使用parsec。你知道如何对语法进行左因子分析以使其实际有效吗?“
buildExpression
parser”可能指的是。我们不能使用buildExpressionParser有什么原因吗?我想这意味着您正在使用parsec。您知道如何对语法进行左因子分析以使其实际有效吗?“
buildExpression
parser”可能指的是。