fix bugs: only wildcard and character-class-negation should check to see if curChr is an endmarker
This commit is contained in:
@@ -2,6 +2,7 @@ signature DFA_GEN_PARAMS =
|
|||||||
sig
|
sig
|
||||||
val endMarker: char
|
val endMarker: char
|
||||||
val charIsEqual: char * char -> bool
|
val charIsEqual: char * char -> bool
|
||||||
|
val charIsNotEqual: char * char -> bool
|
||||||
end
|
end
|
||||||
|
|
||||||
signature DFA_GEN =
|
signature DFA_GEN =
|
||||||
@@ -548,31 +549,22 @@ struct
|
|||||||
fun getFollowsForPositionAndChar (regex: parse_tree, pos, curChr) =
|
fun getFollowsForPositionAndChar (regex: parse_tree, pos, curChr) =
|
||||||
case regex of
|
case regex of
|
||||||
CHAR_LITERAL {char, position = _} =>
|
CHAR_LITERAL {char, position = _} =>
|
||||||
let
|
let val charIsMatch = Fn.charIsEqual (char, curChr)
|
||||||
val charIsMatch =
|
|
||||||
Fn.charIsEqual (char, curChr)
|
|
||||||
andalso not (Fn.charIsEqual (curChr, Fn.endMarker))
|
|
||||||
in
|
|
||||||
{sawConcat = false, follows = [], charIsMatch = charIsMatch}
|
|
||||||
end
|
|
||||||
| WILDCARD _ =>
|
|
||||||
let val charIsMatch = not (Fn.charIsEqual (curChr, Fn.endMarker))
|
|
||||||
in {sawConcat = false, follows = [], charIsMatch = charIsMatch}
|
in {sawConcat = false, follows = [], charIsMatch = charIsMatch}
|
||||||
end
|
end
|
||||||
|
| WILDCARD _ =>
|
||||||
|
let val isNotEndmarker = Fn.charIsNotEqual (curChr, Fn.endMarker)
|
||||||
|
in {sawConcat = false, follows = [], charIsMatch = isNotEndmarker}
|
||||||
|
end
|
||||||
| IS_ANY_CHARACTER {chars, ...} =>
|
| IS_ANY_CHARACTER {chars, ...} =>
|
||||||
let
|
let val chrExists = chrExistsInVec (0, chars, curChr)
|
||||||
val chrExists = chrExistsInVec (0, chars, curChr)
|
in {sawConcat = false, follows = [], charIsMatch = chrExists}
|
||||||
val chrExists =
|
|
||||||
chrExists andalso not (Fn.charIsEqual (curChr, Fn.endMarker))
|
|
||||||
in
|
|
||||||
{sawConcat = false, follows = [], charIsMatch = chrExists}
|
|
||||||
end
|
end
|
||||||
| NOT_ANY_CHARACTER {chars, ...} =>
|
| NOT_ANY_CHARACTER {chars, ...} =>
|
||||||
let
|
let
|
||||||
val charIsValid = chrExistsInVec (0, chars, curChr)
|
val charIsValid = chrExistsInVec (0, chars, curChr)
|
||||||
val charIsValid =
|
val charIsValid =
|
||||||
charIsValid andalso Fn.charIsEqual (curChr, Fn.endMarker)
|
not charIsValid andalso Fn.charIsNotEqual (curChr, Fn.endMarker)
|
||||||
val charIsValid = not charIsValid
|
|
||||||
in
|
in
|
||||||
{sawConcat = false, follows = [], charIsMatch = charIsValid}
|
{sawConcat = false, follows = [], charIsMatch = charIsValid}
|
||||||
end
|
end
|
||||||
@@ -810,8 +802,11 @@ struct
|
|||||||
fun isFinal (dfa: dfa, curState: dfa_state) =
|
fun isFinal (dfa: dfa, curState: dfa_state) =
|
||||||
curState <> ~1
|
curState <> ~1
|
||||||
andalso
|
andalso
|
||||||
let val curTable = Vector.sub (dfa, curState)
|
let
|
||||||
in Vector.sub (curTable, 0) <> ~1
|
val curTable = Vector.sub (dfa, curState)
|
||||||
|
val endMarkerCode = Char.ord Fn.endMarker
|
||||||
|
in
|
||||||
|
Vector.sub (curTable, endMarkerCode) <> ~1
|
||||||
end
|
end
|
||||||
|
|
||||||
fun isDead (curState: dfa_state) = curState = ~1
|
fun isDead (curState: dfa_state) = curState = ~1
|
||||||
@@ -821,12 +816,14 @@ structure CaseInsensitiveDfa =
|
|||||||
MakeDfaGen
|
MakeDfaGen
|
||||||
(struct
|
(struct
|
||||||
val endMarker = #"\^@"
|
val endMarker = #"\^@"
|
||||||
fun charIsEqual (a: char, b: char) = a = b
|
fun charIsEqual (a: char, b: char) = Char.toLower a = Char.toLower b
|
||||||
|
fun charIsNotEqual (a: char, b: char) = a <> b
|
||||||
end)
|
end)
|
||||||
|
|
||||||
structure CaseSensitiveDfa =
|
structure CaseSensitiveDfa =
|
||||||
MakeDfaGen
|
MakeDfaGen
|
||||||
(struct
|
(struct
|
||||||
val endMarker = #"\^@"
|
val endMarker = #"\^@"
|
||||||
fun charIsEqual (a: char, b: char) = Char.toLower a = Char.toLower b
|
fun charIsEqual (a: char, b: char) = a = b
|
||||||
|
fun charIsNotEqual (a: char, b: char) = a <> b
|
||||||
end)
|
end)
|
||||||
|
|||||||
@@ -92,6 +92,8 @@ struct
|
|||||||
if String.size searchString > 0 then search (buffer, searchString)
|
if String.size searchString > 0 then search (buffer, searchString)
|
||||||
else PersistentVector.empty
|
else PersistentVector.empty
|
||||||
|
|
||||||
|
structure DfaGen = CaseInsensitiveDfa
|
||||||
|
|
||||||
fun rangeLoop
|
fun rangeLoop
|
||||||
( dfa
|
( dfa
|
||||||
, bufferPos
|
, bufferPos
|
||||||
|
|||||||
Reference in New Issue
Block a user