基本上我正在修改解析器以处理其他运算符。在我的更改之前,解析器的一部分看起来像这样:
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作为我的环境。
答案 0 :(得分:6)
您是否使用与之前相同的空格分隔符缩进新行?或者,有一个标签字符在那里偷偷摸摸?
答案 1 :(得分:2)
这几乎是100%确定的缩进错误。我在过去也遇到过类似的问题,也就是编写解析器时。可能发生的是有问题的行之前的行是使用制表符缩进的,并且您在T_Power行(或类似的东西)上使用了空格。你能在编辑器中打开非打印字符吗?
答案 2 :(得分:0)
也许你还需要在词法分析器中设置T_Power?例如,您使用什么符号进行取幂(例如^),以及与T_Power相关的符号在哪里?
我不知道this(或类似的东西)是否适合您,但可能是这样的:
scanner (’^’ : cs) = T_Power : scanner cs