|
|
|
@ -32,21 +32,21 @@ func (dec *decoder) executeFinal() {
|
|
|
|
|
func (dec *decoder) execute(typ parser.TokenType) { |
|
|
|
|
switch typ { |
|
|
|
|
case parser.TokenSectionEnd: |
|
|
|
|
name1, ok1 := dec.getValue(1, parser.TokenSectionName) |
|
|
|
|
name1, ok1 := dec.queueValue(1, parser.TokenSectionName) |
|
|
|
|
|
|
|
|
|
if ok1 { |
|
|
|
|
name2, ok2 := dec.getValue(2, parser.TokenSectionSubname) |
|
|
|
|
name2, ok2 := dec.queueValue(2, parser.TokenSectionSubname) |
|
|
|
|
|
|
|
|
|
dec.addSection(name1, name2, ok2) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dec.reset() |
|
|
|
|
dec.queueReset() |
|
|
|
|
case parser.TokenFieldValue: |
|
|
|
|
key, _ := dec.getValue(0, parser.TokenFieldKey) |
|
|
|
|
value, _ := dec.getValue(1, parser.TokenFieldValue) |
|
|
|
|
key, _ := dec.queueValue(0, parser.TokenFieldKey) |
|
|
|
|
value, _ := dec.queueValue(1, parser.TokenFieldValue) |
|
|
|
|
|
|
|
|
|
dec.addField(key, value) |
|
|
|
|
dec.reset() |
|
|
|
|
dec.queueReset() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -82,7 +82,8 @@ func (dec *decoder) addField(key, value string) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (dec *decoder) getValue(idx int, typ parser.TokenType) (string, bool) { |
|
|
|
|
// queueValue extracts the value of element on the queue if the type matches.
|
|
|
|
|
func (dec *decoder) queueValue(idx int, typ parser.TokenType) (string, bool) { |
|
|
|
|
switch { |
|
|
|
|
case idx < 0 || idx >= len(dec.queue): |
|
|
|
|
// out of range
|
|
|
|
@ -95,40 +96,48 @@ func (dec *decoder) getValue(idx int, typ parser.TokenType) (string, bool) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (dec *decoder) reset() { |
|
|
|
|
// queueReset removes all tokens from the queue
|
|
|
|
|
func (dec *decoder) queueReset() { |
|
|
|
|
dec.queue = dec.queue[:0] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (dec *decoder) depth(depth int) bool { |
|
|
|
|
// queueDepth confirms the current depth of the queue
|
|
|
|
|
func (dec *decoder) queueDepth(depth int) bool { |
|
|
|
|
return len(dec.queue) == depth |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (dec *decoder) depthAfter(depth int, typ parser.TokenType) bool { |
|
|
|
|
_, ok := dec.getValue(depth-1, typ) |
|
|
|
|
if ok { |
|
|
|
|
return len(dec.queue) == depth |
|
|
|
|
// queueDepthType confirms the current depth of the queue and the type of the last
|
|
|
|
|
// element.
|
|
|
|
|
func (dec *decoder) queueDepthType(depth int, typ parser.TokenType) bool { |
|
|
|
|
if dec.queueDepth(depth) { |
|
|
|
|
return dec.queueType(depth-1, typ) |
|
|
|
|
} |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// queueType tells if the specified element on the queue is of the required type.
|
|
|
|
|
func (dec *decoder) queueType(idx int, typ parser.TokenType) bool { |
|
|
|
|
_, ok := dec.queueValue(idx, typ) |
|
|
|
|
return ok |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (dec *decoder) typeOK(typ parser.TokenType) bool { |
|
|
|
|
switch typ { |
|
|
|
|
case parser.TokenSectionStart, parser.TokenFieldKey: |
|
|
|
|
// first token only
|
|
|
|
|
return dec.depth(0) |
|
|
|
|
return dec.queueDepth(0) |
|
|
|
|
case parser.TokenSectionName: |
|
|
|
|
// right after TokenSectionStart
|
|
|
|
|
return dec.depthAfter(1, parser.TokenSectionStart) |
|
|
|
|
return dec.queueDepthType(1, parser.TokenSectionStart) |
|
|
|
|
case parser.TokenSectionSubname: |
|
|
|
|
// right after TokenSectionName
|
|
|
|
|
return dec.depthAfter(2, parser.TokenSectionName) |
|
|
|
|
return dec.queueDepthType(2, parser.TokenSectionName) |
|
|
|
|
case parser.TokenSectionEnd: |
|
|
|
|
// only on a section with name
|
|
|
|
|
_, ok := dec.getValue(1, parser.TokenSectionName) |
|
|
|
|
return ok |
|
|
|
|
return dec.queueType(1, parser.TokenSectionName) |
|
|
|
|
case parser.TokenFieldValue: |
|
|
|
|
// right after a TokenFieldKey
|
|
|
|
|
return dec.depthAfter(1, parser.TokenFieldKey) |
|
|
|
|
return dec.queueDepthType(1, parser.TokenFieldKey) |
|
|
|
|
default: |
|
|
|
|
// never
|
|
|
|
|
return false |
|
|
|
@ -149,6 +158,8 @@ func (dec *decoder) OnToken(pos lexer.Position, typ parser.TokenType, value stri
|
|
|
|
|
return nil |
|
|
|
|
default: |
|
|
|
|
// unacceptable
|
|
|
|
|
return newErrInvalidToken(t) |
|
|
|
|
err := newErrInvalidToken(t) |
|
|
|
|
dec.executeFinal() |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|