Haskell:在模式匹配中添加新行时出现语法错误

时间:2010-02-24 12:14:34

标签: parsing haskell compiler-construction

基本上我正在修改解析器以处理其他运算符。在我的更改之前,解析器的一部分看起来像这样:

parseExpRec e1 (op : ts)  = 
 let (e2, ts') = parsePrimExp ts in
   case op of
     T_Plus    ->  parseExpRec (BinOpApp Plus   e1 e2) ts'
     T_Minus   ->  parseExpRec (BinOpApp Minus  e1 e2) ts'
     T_Times   ->  parseExpRec (BinOpApp Times  e1 e2) ts'
     T_Divide  ->  parseExpRec (BinOpApp Divide e1 e2) ts'
     _         ->  (e1, op : ts)

T_Plus等是Token数据类型的成员,Plus,Minus等是BinOp的一部分,BinOpApp应用于两个操作数。我更新了Token和BinOpApp数据类型以处理Power(取幂)令牌。这是结果代码:

parseExpRec e1 (op : ts)  = 
 let (e2, ts') = parsePrimExp ts in
   case op of
     T_Plus    ->  parseExpRec (BinOpApp Plus   e1 e2) ts'
     T_Minus   ->  parseExpRec (BinOpApp Minus  e1 e2) ts'
     T_Times   ->  parseExpRec (BinOpApp Times  e1 e2) ts'
     T_Divide  ->  parseExpRec (BinOpApp Divide e1 e2) ts'
     T_Power   ->  parseExpRec (BinOpApp Power  e1 e2) ts'
     _         ->  (e1, op : ts)

这看起来很简单,但它现在给出了以下错误:

  

TXL.hs:182:13:输入' - >'

解析错误

第182行是我添加“T_Power - > parseExpRec ...”的行 - 我看不出它与其他行有什么不同,它解析得很好。我正在使用GHCi作为我的环境。

3 个答案:

答案 0 :(得分:6)

您是否使用与之前相同的空格分隔符缩进新行?或者,有一个标签字符在那里偷偷摸摸?

答案 1 :(得分:2)

这几乎是100%确定的缩进错误。我在过去也遇到过类似的问题,也就是编写解析器时。可能发生的是有问题的行之前的行是使用制表符缩进的,并且您在T_Power行(或类似的东西)上使用了空格。你能在编辑器中打开非打印字符吗?

答案 2 :(得分:0)

也许你还需要在词法分析器中设置T_Power?例如,您使用什么符号进行取幂(例如^),以及与T_Power相关的符号在哪里?

我不知道this(或类似的东西)是否适合您,但可能是这样的:

scanner (’^’ : cs) = T_Power : scanner cs