cleanup state machine
This commit is contained in:
parent
73098a2973
commit
77f709ebd5
@ -44,6 +44,40 @@ const (
|
|||||||
StateTransitioningToTerminate
|
StateTransitioningToTerminate
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var JSONStates = []JSONState{
|
||||||
|
StateStart,
|
||||||
|
StateInObject,
|
||||||
|
StateInObjectKey,
|
||||||
|
StateNewline,
|
||||||
|
StateTab,
|
||||||
|
StateSpace,
|
||||||
|
StateInString,
|
||||||
|
StateInInt,
|
||||||
|
StateInFloat,
|
||||||
|
StateInBool,
|
||||||
|
StateInNull,
|
||||||
|
StateInColon,
|
||||||
|
StateInComma,
|
||||||
|
StateInTab,
|
||||||
|
StateInSpace,
|
||||||
|
StateInObjSpace,
|
||||||
|
StateInList,
|
||||||
|
StateInListComma,
|
||||||
|
StateListEnd,
|
||||||
|
StateInValue,
|
||||||
|
StateInValueEnd,
|
||||||
|
StateInListEnd,
|
||||||
|
StateInListObjectEnd,
|
||||||
|
StateInNewline,
|
||||||
|
StateInNumber,
|
||||||
|
StateInNumberEnd,
|
||||||
|
StateInStringEnd,
|
||||||
|
StateInObjectKeyEnd,
|
||||||
|
StateTerminate,
|
||||||
|
StateInObjectEnd,
|
||||||
|
StateTransitioningToTerminate,
|
||||||
|
}
|
||||||
|
|
||||||
func (s JSONState) String() string {
|
func (s JSONState) String() string {
|
||||||
switch s {
|
switch s {
|
||||||
case StateStart:
|
case StateStart:
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// TODO: / should be valid but an escape character
|
// TODO: / should be valid but an escape character
|
||||||
|
|
||||||
var stringInvalidRunes = []rune{'\\', '\n', '\t', '{', '}', ':', ',', '/'}
|
var stringInvalidRunes = []rune{'\\', '\n', '\t', '{', '}', ':', ',', '/'}
|
||||||
|
|
||||||
var intInvalidRunes = []rune{'e', 'E', ' ', '\n', '\t', '{', '}', ':', ',', '"'}
|
var intInvalidRunes = []rune{'e', 'E', ' ', '\n', '\t', '{', '}', ':', ',', '"'}
|
||||||
@ -37,172 +36,112 @@ func BuildGraph(proc model.TextProcessor) (*PDANode, map[JSONState]*PDANode, err
|
|||||||
stateToNodeMap := make(map[JSONState]*PDANode)
|
stateToNodeMap := make(map[JSONState]*PDANode)
|
||||||
|
|
||||||
// TODO: make this a loop
|
// TODO: make this a loop
|
||||||
startNode := NewPDANode(StateStart)
|
|
||||||
stateToNodeMap[StateStart] = startNode
|
|
||||||
|
|
||||||
objNode := NewPDANode(StateInObject)
|
|
||||||
stateToNodeMap[StateInObject] = objNode
|
|
||||||
|
|
||||||
objEndNode := NewPDANode(StateInObjectEnd)
|
|
||||||
stateToNodeMap[StateInObjectEnd] = objEndNode
|
|
||||||
|
|
||||||
objKeyNode := NewPDANode(StateInObjectKey)
|
|
||||||
stateToNodeMap[StateInObjectKey] = objKeyNode
|
|
||||||
|
|
||||||
objKeyEndNode := NewPDANode(StateInObjectKeyEnd)
|
|
||||||
stateToNodeMap[StateInObjectKeyEnd] = objKeyEndNode
|
|
||||||
|
|
||||||
colonNode := NewPDANode(StateInColon)
|
|
||||||
stateToNodeMap[StateInColon] = colonNode
|
|
||||||
|
|
||||||
commaNode := NewPDANode(StateInComma)
|
|
||||||
stateToNodeMap[StateInComma] = commaNode
|
|
||||||
|
|
||||||
newlineNode := NewPDANode(StateInNewline)
|
|
||||||
stateToNodeMap[StateInNewline] = newlineNode
|
|
||||||
|
|
||||||
spaceNode := NewPDANode(StateInSpace)
|
|
||||||
stateToNodeMap[StateInSpace] = spaceNode
|
|
||||||
|
|
||||||
spaceObjNode := NewPDANode(StateInObjSpace)
|
|
||||||
stateToNodeMap[StateInObjSpace] = spaceObjNode
|
|
||||||
|
|
||||||
tabNode := NewPDANode(StateInTab)
|
|
||||||
stateToNodeMap[StateInTab] = tabNode
|
|
||||||
|
|
||||||
stringNode := NewPDANode(StateInString)
|
|
||||||
stateToNodeMap[StateInString] = stringNode
|
|
||||||
|
|
||||||
stringEndNode := NewPDANode(StateInStringEnd)
|
|
||||||
stateToNodeMap[StateInStringEnd] = stringEndNode
|
|
||||||
|
|
||||||
listNode := NewPDANode(StateInList)
|
|
||||||
stateToNodeMap[StateInList] = listNode
|
|
||||||
|
|
||||||
listCommaNode := NewPDANode(StateInListComma)
|
|
||||||
stateToNodeMap[StateInListComma] = listCommaNode
|
|
||||||
|
|
||||||
listEndNode := NewPDANode(StateListEnd)
|
|
||||||
stateToNodeMap[StateListEnd] = listEndNode
|
|
||||||
|
|
||||||
numberNode := NewPDANode(StateInNumber)
|
|
||||||
stateToNodeMap[StateInNumber] = numberNode
|
|
||||||
|
|
||||||
boolNode := NewPDANode(StateInBool)
|
|
||||||
stateToNodeMap[StateInBool] = boolNode
|
|
||||||
|
|
||||||
nullNode := NewPDANode(StateInNull)
|
|
||||||
stateToNodeMap[StateInNull] = nullNode
|
|
||||||
|
|
||||||
// Defined with structured outputs only
|
|
||||||
intNode := NewPDANode(StateInInt)
|
|
||||||
stateToNodeMap[StateInInt] = intNode
|
|
||||||
|
|
||||||
listObjEndNode := NewPDANode(StateInListObjectEnd)
|
|
||||||
stateToNodeMap[StateInListObjectEnd] = listObjEndNode
|
|
||||||
|
|
||||||
|
for _, state := range JSONStates {
|
||||||
|
stateToNodeMap[state] = NewPDANode(state)
|
||||||
|
}
|
||||||
// TODO:
|
// TODO:
|
||||||
// consider adding a node to just point to values, could be good to compute that
|
// consider adding a node to just point to values, could be good to compute that
|
||||||
// mask rather than many different nodes
|
// mask rather than many different nodes
|
||||||
|
|
||||||
// Connect nodes
|
// Connect nodes
|
||||||
// TODO: if all are single tokens then this can just be connected instead of defining the token
|
// TODO: if all are single tokens then this can just be connected instead of defining the token
|
||||||
startNode.TransitionEdges['{'] = objNode
|
stateToNodeMap[StateStart].TransitionEdges['{'] = stateToNodeMap[StateInObject]
|
||||||
|
|
||||||
objNode.TransitionEdges['"'] = objKeyNode
|
stateToNodeMap[StateInObject].TransitionEdges['"'] = stateToNodeMap[StateInObjectKey]
|
||||||
objNode.TransitionEdges['\n'] = newlineNode
|
stateToNodeMap[StateInObject].TransitionEdges['\n'] = stateToNodeMap[StateInNewline]
|
||||||
objNode.TransitionEdges[' '] = spaceObjNode
|
stateToNodeMap[StateInObject].TransitionEdges[' '] = stateToNodeMap[StateInObjSpace]
|
||||||
|
|
||||||
//new line
|
//new line
|
||||||
newlineNode.TransitionEdges['"'] = objKeyNode
|
stateToNodeMap[StateInNewline].TransitionEdges['"'] = stateToNodeMap[StateInObjectKey]
|
||||||
newlineNode.TransitionEdges['\t'] = tabNode
|
stateToNodeMap[StateInNewline].TransitionEdges['\t'] = stateToNodeMap[StateInTab]
|
||||||
|
|
||||||
tabNode.TransitionEdges['"'] = objKeyNode
|
stateToNodeMap[StateInTab].TransitionEdges['"'] = stateToNodeMap[StateInObjectKey]
|
||||||
|
|
||||||
objKeyNode.TransitionEdges[rune(-1)] = objKeyNode
|
stateToNodeMap[StateInObjectKey].TransitionEdges[rune(-1)] = stateToNodeMap[StateInObjectKey]
|
||||||
objKeyNode.TransitionEdges['"'] = objKeyEndNode
|
stateToNodeMap[StateInObjectKey].TransitionEdges['"'] = stateToNodeMap[StateInObjectKeyEnd]
|
||||||
|
|
||||||
objKeyEndNode.TransitionEdges[':'] = colonNode
|
stateToNodeMap[StateInObjectKeyEnd].TransitionEdges[':'] = stateToNodeMap[StateInColon]
|
||||||
|
|
||||||
objEndNode.TransitionEdges[','] = commaNode
|
stateToNodeMap[StateInObjectEnd].TransitionEdges[','] = stateToNodeMap[StateInComma]
|
||||||
objEndNode.TransitionEdges['}'] = objEndNode
|
stateToNodeMap[StateInObjectEnd].TransitionEdges['}'] = stateToNodeMap[StateInObjectEnd]
|
||||||
|
|
||||||
// where values should be
|
// where values should be
|
||||||
// this could be combined but the probs might change, we're alr doing a skip ahead
|
// this could be combined but the probl might change, we're alr doing a skip ahead
|
||||||
colonNode.TransitionEdges[' '] = spaceNode
|
stateToNodeMap[StateInColon].TransitionEdges[' '] = stateToNodeMap[StateInSpace]
|
||||||
colonNode.TransitionEdges['['] = listNode
|
stateToNodeMap[StateInColon].TransitionEdges['['] = stateToNodeMap[StateInList]
|
||||||
colonNode.TransitionEdges['{'] = objNode
|
stateToNodeMap[StateInColon].TransitionEdges['{'] = stateToNodeMap[StateInObject]
|
||||||
addValueConnections(colonNode, stateToNodeMap)
|
addValueConnections(stateToNodeMap[StateInColon], stateToNodeMap)
|
||||||
|
|
||||||
// Leads to a value
|
// Leads to a value
|
||||||
spaceNode.TransitionEdges['['] = listNode
|
stateToNodeMap[StateInSpace].TransitionEdges['['] = stateToNodeMap[StateInList]
|
||||||
spaceNode.TransitionEdges['{'] = objNode
|
stateToNodeMap[StateInSpace].TransitionEdges['{'] = stateToNodeMap[StateInObject]
|
||||||
addValueConnections(spaceNode, stateToNodeMap)
|
addValueConnections(stateToNodeMap[StateInSpace], stateToNodeMap)
|
||||||
|
|
||||||
// Values
|
// Values
|
||||||
// string node
|
// string node
|
||||||
stringNode.TransitionEdges[rune(-1)] = stringNode
|
stateToNodeMap[StateInString].TransitionEdges[rune(-1)] = stateToNodeMap[StateInString]
|
||||||
stringNode.TransitionEdges['"'] = stringEndNode
|
stateToNodeMap[StateInString].TransitionEdges['"'] = stateToNodeMap[StateInStringEnd]
|
||||||
|
|
||||||
// String end node
|
// String end node
|
||||||
addEnds(stringEndNode, stateToNodeMap)
|
addEnds(stateToNodeMap[StateInStringEnd], stateToNodeMap)
|
||||||
|
|
||||||
// TODO: add counters for allowable number of decimals, e, E, etc
|
// TODO: add counters for allowable number of decimals, e, E, etc
|
||||||
// number node
|
// number node
|
||||||
for _, r := range validNumberRunes {
|
for _, r := range validNumberRunes {
|
||||||
numberNode.TransitionEdges[r] = numberNode
|
stateToNodeMap[StateInNumber].TransitionEdges[r] = stateToNodeMap[StateInNumber]
|
||||||
}
|
}
|
||||||
addEnds(numberNode, stateToNodeMap)
|
addEnds(stateToNodeMap[StateInNumber], stateToNodeMap)
|
||||||
|
|
||||||
// bool node
|
// bool node
|
||||||
for _, r := range validBoolRunes {
|
for _, r := range validBoolRunes {
|
||||||
boolNode.TransitionEdges[r] = boolNode
|
stateToNodeMap[StateInBool].TransitionEdges[r] = stateToNodeMap[StateInBool]
|
||||||
}
|
}
|
||||||
addEnds(boolNode, stateToNodeMap)
|
addEnds(stateToNodeMap[StateInBool], stateToNodeMap)
|
||||||
|
|
||||||
// list node
|
// list node
|
||||||
listNode.TransitionEdges[','] = commaNode
|
stateToNodeMap[StateInList].TransitionEdges[','] = stateToNodeMap[StateInComma]
|
||||||
listNode.TransitionEdges['{'] = objNode
|
stateToNodeMap[StateInList].TransitionEdges['{'] = stateToNodeMap[StateInObject]
|
||||||
listNode.TransitionEdges[' '] = listNode
|
stateToNodeMap[StateInList].TransitionEdges[' '] = stateToNodeMap[StateInList]
|
||||||
listNode.TransitionEdges['\n'] = listNode
|
stateToNodeMap[StateInList].TransitionEdges['\n'] = stateToNodeMap[StateInList]
|
||||||
addValueConnections(listNode, stateToNodeMap)
|
addValueConnections(stateToNodeMap[StateInList], stateToNodeMap)
|
||||||
|
|
||||||
// null node
|
// null node
|
||||||
for _, r := range validNullRunes {
|
for _, r := range validNullRunes {
|
||||||
nullNode.TransitionEdges[r] = nullNode
|
stateToNodeMap[StateInNull].TransitionEdges[r] = stateToNodeMap[StateInNull]
|
||||||
}
|
}
|
||||||
addEnds(nullNode, stateToNodeMap)
|
addEnds(stateToNodeMap[StateInNull], stateToNodeMap)
|
||||||
|
|
||||||
// list comma
|
// list comma
|
||||||
// should point to values
|
// should point to values
|
||||||
listCommaNode.TransitionEdges[' '] = listCommaNode
|
stateToNodeMap[StateInListComma].TransitionEdges[' '] = stateToNodeMap[StateInListComma]
|
||||||
listCommaNode.TransitionEdges['{'] = objNode
|
stateToNodeMap[StateInListComma].TransitionEdges['{'] = stateToNodeMap[StateInObject]
|
||||||
listCommaNode.TransitionEdges['\n'] = newlineNode
|
stateToNodeMap[StateInListComma].TransitionEdges['\n'] = stateToNodeMap[StateInList]
|
||||||
addValueConnections(listCommaNode, stateToNodeMap)
|
addValueConnections(stateToNodeMap[StateInListComma], stateToNodeMap)
|
||||||
|
|
||||||
// list object end
|
// list object end
|
||||||
listObjEndNode.TransitionEdges[','] = listCommaNode
|
stateToNodeMap[StateInListObjectEnd].TransitionEdges[','] = stateToNodeMap[StateInListComma]
|
||||||
listObjEndNode.TransitionEdges[']'] = listEndNode
|
stateToNodeMap[StateInListObjectEnd].TransitionEdges[']'] = stateToNodeMap[StateListEnd]
|
||||||
|
|
||||||
// bool node
|
// bool node
|
||||||
for _, r := range validBoolRunes {
|
for _, r := range validBoolRunes {
|
||||||
boolNode.TransitionEdges[r] = boolNode
|
stateToNodeMap[StateInBool].TransitionEdges[r] = stateToNodeMap[StateInBool]
|
||||||
}
|
}
|
||||||
addEnds(boolNode, stateToNodeMap)
|
addEnds(stateToNodeMap[StateInBool], stateToNodeMap)
|
||||||
|
|
||||||
listEndNode.TransitionEdges['}'] = objEndNode
|
stateToNodeMap[StateListEnd].TransitionEdges['}'] = stateToNodeMap[StateInObjectEnd]
|
||||||
listEndNode.TransitionEdges[','] = commaNode
|
stateToNodeMap[StateListEnd].TransitionEdges[','] = stateToNodeMap[StateInComma]
|
||||||
|
|
||||||
commaNode.TransitionEdges['{'] = objNode
|
stateToNodeMap[StateInComma].TransitionEdges['{'] = stateToNodeMap[StateInObject]
|
||||||
commaNode.TransitionEdges['\n'] = newlineNode
|
stateToNodeMap[StateInComma].TransitionEdges['\n'] = stateToNodeMap[StateInList]
|
||||||
commaNode.TransitionEdges['\t'] = tabNode
|
stateToNodeMap[StateInComma].TransitionEdges['\t'] = stateToNodeMap[StateInTab]
|
||||||
commaNode.TransitionEdges['"'] = objKeyNode
|
stateToNodeMap[StateInComma].TransitionEdges['"'] = stateToNodeMap[StateInObjectKey]
|
||||||
commaNode.TransitionEdges[' '] = spaceObjNode
|
stateToNodeMap[StateInComma].TransitionEdges[' '] = stateToNodeMap[StateInObjSpace]
|
||||||
|
|
||||||
spaceObjNode.TransitionEdges['"'] = objKeyNode
|
stateToNodeMap[StateInObjSpace].TransitionEdges['"'] = stateToNodeMap[StateInObjectKey]
|
||||||
spaceObjNode.TransitionEdges['\n'] = newlineNode
|
stateToNodeMap[StateInObjSpace].TransitionEdges['\n'] = stateToNodeMap[StateInNewline]
|
||||||
|
|
||||||
return startNode, stateToNodeMap, nil
|
return stateToNodeMap[StateStart], stateToNodeMap, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func addEnds(node *PDANode, stateToNodeMap map[JSONState]*PDANode) {
|
func addEnds(node *PDANode, stateToNodeMap map[JSONState]*PDANode) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user