プロジェクトでは、小さなarduinoロボットを制御するhaskellパーサ/エバリュエータを作成する必要があります。Parsec:作業パーサーを拡張すると奇妙な結果が得られます
はじめに、私は基本的に既に実装されているパーサーの設定についていくつかの研究を行いましたが、これは、https://wiki.haskell.org/Parsing_a_simple_imperative_languageです。
コードをコピーして貼り付けた後、テストを開始しました。それは\ o /働いた。 今度は機能を拡張する時が来ました。
編集コード:
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;
上記のコードは私の変更の前にbeatifully解析されたが、私は変更を追加した後、私は私の限られた知識で、次のエラー
< (line 3, column 1):
< unexpected end of input
< expecting "if", "while", "skip", identifier or "set"
を取得しますハスケルのこの "unexpected end of input
"がなぜ起こっているのか分かりません。
おそらく、ここのハスケラーは私にエラーを指摘することができます。
が行わお返事を読みます私はすぐに私の "間違い"を認識します。すべてのセミコロンは、別の行/文が必要/必要であるようにします。そして空の行は型に変換できないので、それは誤りです。ありがとうございます! – MrKickkiller