По сути, я модифицирую парсер для обработки дополнительных операторов. До моих изменений одна часть парсера выглядела так:
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, минус и т. Д. Являются частью 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 в качестве своего окружения.