improve parsing code slightly, with successful parsing when saved .dsc file has inconsistent spacing
This commit is contained in:
2
a.dsc
2
a.dsc
@@ -1,2 +1,2 @@
|
|||||||
x ~0.0499999858439 y 0.400000035763 x ~0.400000035763 y 0.350000023842 x ~0.100000038743 y 0.100000038743
|
x ~0.0499999858439 y 0.400000035763 x ~0.400000035763 y 0.350000023842 x ~0.100000038743 y 0.100000038743
|
||||||
x 0.25 y ~0.449999958277 x 0.599999964237 y ~0.199999943376 x 0.0499999858439 y 0.0499999858439
|
x 0.25 y ~0.449999958277 x 0.599999964237 y ~0.199999943376 x 0.0499999858439 y 0.0499999858439
|
||||||
|
|||||||
@@ -29,27 +29,41 @@ struct
|
|||||||
SOME num => COORD num
|
SOME num => COORD num
|
||||||
| NONE => UNKNOWN str
|
| NONE => UNKNOWN str
|
||||||
|
|
||||||
fun helpParseLine (line, pos, acc, lastSpacePos) =
|
fun helpParseLine (line, pos, acc, wordStartPos) =
|
||||||
if pos = String.size line then
|
if pos = String.size line then
|
||||||
List.rev acc
|
List.rev acc
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
val chr = String.sub (line, pos)
|
val chr = String.sub (line, pos)
|
||||||
in
|
in
|
||||||
if chr = #" " orelse chr = #"\n" then
|
if Char.isSpace chr then
|
||||||
let
|
if pos > 0 andalso Char.isSpace (String.sub (line, pos - 1)) then
|
||||||
val strToken = String.substring
|
(* if previous character is space, just proceed to next character *)
|
||||||
(line, lastSpacePos + 1, pos - (lastSpacePos + 1))
|
helpParseLine (line, pos + 1, acc, wordStartPos)
|
||||||
val token = tokeniseString strToken
|
else
|
||||||
in
|
let
|
||||||
helpParseLine (line, pos + 1, token :: acc, pos)
|
(* current character is space, but previous character is not,
|
||||||
end
|
* which means we have some text to substring and tokenise
|
||||||
|
* before proceeding to next character *)
|
||||||
|
val strToken =
|
||||||
|
String.substring (line, wordStartPos, pos - wordStartPos)
|
||||||
|
val token = tokeniseString strToken
|
||||||
|
in
|
||||||
|
helpParseLine (line, pos + 1, token :: acc, pos)
|
||||||
|
end
|
||||||
|
else if pos > 0 andalso Char.isSpace (String.sub (line, pos - 1)) then
|
||||||
|
(* previous character was space but current character is not,
|
||||||
|
* meaning that we have hit the start of a new word *)
|
||||||
|
helpParseLine (line, pos + 1, acc, pos)
|
||||||
else
|
else
|
||||||
helpParseLine (line, pos + 1, acc, lastSpacePos)
|
(* just proceed to next character *)
|
||||||
|
helpParseLine (line, pos + 1, acc, wordStartPos)
|
||||||
end
|
end
|
||||||
|
|
||||||
fun parseLine line =
|
fun parseLine line =
|
||||||
let val lst = helpParseLine (line, 0, [], ~1)
|
let
|
||||||
in extractTriangle lst
|
val lst = helpParseLine (line, 0, [], 0)
|
||||||
|
in
|
||||||
|
extractTriangle lst
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user