- Notifications
You must be signed in to change notification settings - Fork131
Open
Description
implicitdefliteral(s:String):Parser[String]=newParser[String] {defapply(in:Input)= {valsource= in.sourcevaloffset= in.offsetvalstart= handleWhiteSpace(source, offset)vari=0varj= startwhile (i< s.length&& j< source.length&& s.charAt(i)== source.charAt(j)) { i+=1 j+=1 }if (i== s.length)Success(source.subSequence(start, j).toString, in.drop(j- offset),None)else {valfound=if (start== source.length())"end of source"else"'"+source.charAt(start)+"'"Failure("'"+s+"' expected but"+found+" found", in.drop(start- offset)) } }}
Note the error reporting at the end where the index of the mismatch is reported asstart
. If the string is"apple"
, and the input"...apply..."
, the mismatch is at the character'y'
, which is pointed to by the variablej
, not at the character'a'
, which is pointed to bystart
.
println(parse("apple","apply"))
Failure('apple' expected but 'a' found,CharSequenceReader('a', ...))
A potential fix may be as follows:
valrest= in.drop(start- offset)if (start== source.length())Failure(s"'$s' expected but end of source found", rest)elseFailure(s"'$s' expected but '${source.charAt(j)}' found at index$j", rest)
Metadata
Metadata
Assignees
Labels
No labels