Для проекта нам поручили создать парсер/оценщик haskell, который управляет крошечным роботом arduino.
Итак, для начала я провел некоторое исследование уже реализованных настроек парсера и наткнулся на этот: https://wiki.haskell.org/Parsing_a_simple_imperative_language.
После (по общему признанию) копирования и вставки кода я начал его тестировать. И это сработало\о/. Теперь пришло время расширить его функциональность.
Отредактированный код:
data Stmt = Seq [Stmt]
| Assign String AExpr
| If BExpr Stmt Stmt
| While BExpr Stmt
| Motor String AExpr
| Skip
deriving (Show)
Token.reservedNames = [ "if"
, "then"
, "else"
, "while"
, "do"
, "skip"
, "true"
, "false"
, "not"
, "and"
, "or", "set" , "to"
]
statement' :: Parser Stmt
statement' = ifStmt
<|> whileStmt
<|> skipStmt
<|> assignStmt
<|> motorStatement
motorStatement :: Parser Stmt
motorStatement =
do reserved "set"
var <- identifier
reserved "to"
expr <- aExpression
return $ Motor var expr
Это единственные фрагменты кода, которые я редактировал. Чтобы проверить все это, я сделал небольшой тестовый файл:
x := 4;
x := 6;
Приведенный выше код прекрасно проанализирован до моих изменений, но после того, как я добавил изменения, я получаю следующую ошибку
< (line 3, column 1):
< unexpected end of input
< expecting "if", "while", "skip", identifier or "set"
С моими ограниченными знаниями о Haskell я не могу понять, почему происходит это "unexpected end of input
".
Возможно, какой-нибудь Haskeller здесь сможет указать мне на ошибку.