Haskell: синтаксическая ошибка при добавлении новой строки при сопоставлении с образцом - PullRequest
4 голосов
/ 24 февраля 2010

По сути, я модифицирую парсер для обработки дополнительных операторов. До моих изменений одна часть парсера выглядела так:

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 в качестве своего окружения.

Ответы [ 3 ]

6 голосов
/ 24 февраля 2010

Вы пометили новую строку тем же разделителем пробелов, что и предыдущие? Или там есть символ табуляции?

2 голосов
/ 24 февраля 2010

Это почти со 100% уверенностью ошибка отступа. У меня были подобные проблемы в прошлом, также при написании парсера. Вероятно, произошло то, что строки перед проблемной строкой имеют отступы от табуляции, и вы использовали пробелы в строке T_Power (или что-то подобное) Можете ли вы включить непечатные символы в вашем редакторе?

0 голосов
/ 24 февраля 2010

Может быть, вам все еще нужно настроить T_Power в лексере? Например, какой символ вы используете для возведения в степень (например, ^), и где он связан с T_Power?

Я не знаю, это (или что-то подобное) - это то, из чего вы работаете, но может быть что-то вроде:

scanner (’^’ : cs) = T_Power : scanner cs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...