2014-10-17 2 views
1

실패 분석 왼쪽 고토하지 않는, 그 결과는 "오른쪽"파섹은 심지어 내가 예제 코드 타격으로 <a href="https://github.com/JakeWheat/intro_to_parsing" rel="nofollow">https://github.com/JakeWheat/intro_to_parsing</a></p> <p>와 파섹을 배우고

사람이 친절하게 나에게 몇 가지 팁을주고 항상?

*Main> regularParse parser4search "a" 
Loading package array-0.5.0.0 ... linking ... done. 
Loading package deepseq-1.3.0.2 ... linking ... done. 
Loading package bytestring-0.10.4.0 ... linking ... done. 
Loading package text-1.1.0.0 ... linking ... done. 
Loading package transformers-0.3.0.0 ... linking ... done. 
Loading package mtl-2.1.3.1 ... linking ... done. 
Loading package parsec-3.1.7 ... linking ... done. 
Right (Num *** Exception: Prelude.read: no parse 
*Main> regularParse parser4search "1" 
Right (Num 1) 

=================

import Text.Parsec (parse,anyChar) 
import Text.Parsec.String --(Parser) 
import Text.Parsec.Char (oneOf, char, digit, satisfy,letter) 
import Text.Parsec.Combinator (many1, choice, chainl1) 
import Control.Applicative ((<|>), many) 
import Control.Monad --(void) 
import Data.Char --(isLetter, isDigit) 


data SimpleExpr = Num Integer 
      | Var String 
      | Add SimpleExpr SimpleExpr 
      | Parens SimpleExpr 
      | Str [Char] 
       deriving (Eq,Show) 

regularParse p = parse p "" 

parser4search:: Parser SimpleExpr 
parser4search = do 
    searchStr <- many digit 
    return (Num (read searchStr)) 

답변

1
오류가 구문 분석에 없기 때문에

파섹 오류 (왼쪽 값을) 포기하지 않는다 "는 ". many digit 문은 정수 문자를 찾지 못하는 경우를 대비하여 빈 문자열을 반환합니다. 코드를 작동 시키려면 빈 문자열을 처리해야합니다. 예를 들어.

parser4search:: Parser SimpleExpr 
parser4search = do 
    searchStr <- many digit 
    if searchStr == [] 
    then return (Num 0) 
    else return (Num (read searchStr)) 
3

many은 0 개 이상의 항목을 구문 분석한다는 의미입니다.

many1은 하나 이상의 항목을 구문 분석하는 것을 의미합니다.

따라서 many digit은 "1", "24"또는 ""입력으로 성공합니다.

many1은 "1", "24"입력에서는 성공하지만 ""와는 실패합니다. 이것이 당신이 원하는 것 같은데.

분석되지 않은 항목이 허용되지 않도록 eof을보고 싶을 수도 있습니다.