2016-05-14 8 views
1

プロジェクトでは、小さな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"がなぜ起こっているのか分かりません。

おそらく、ここのハスケラーは私にエラーを指摘することができます。

答えて

2

変更を加える前にあなたの入力が正しく解析されたとは確信していません。文のリストは、sepBy1を使用して解析されます。

sequenceOfStmt = 
    do list <- (sepBy1 statement' semi) 
    -- If there's only one statement return it without using Seq. 
    return $ if length list == 1 then head list else Seq list 

sequenceOfStmtは、それが別のstatement'を見ることを期待しますセミコロンを見ればその中に貪欲です。したがって、セミコロンは、文の終端記号ではなく、文の区切り記号とみなされます。

がどのようにsepBy1振る舞う見るためにこれらのテストを実行してみましょう:この問題を探求しやすくするために

import Text.Parsec 
import Text.Parsec.Combinator 

p1 = sepBy1 (char 'a') (char ';') 

test1 = parseTest p1 "a;a"  -- OK 
test2 = parseTest p1 "a;a;"  -- FAILS 

を、私はlpaste.net上ParseWhile言語のソースを入れている:http://lpaste.net/163332

+0

が行わお返事を読みます私はすぐに私の "間違い"を認識します。すべてのセミコロンは、別の行/文が必要/必要であるようにします。そして空の行は型に変換できないので、それは誤りです。ありがとうございます! – MrKickkiller

関連する問題