Drafting ProductStatement
This commit is contained in:
		@@ -135,6 +135,54 @@ func ( this *Lexer ) ReadDecimal() ( f float64, err error ) {
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ( this *Lexer ) ReadKeyword( Keyword string ) ( err error ) {
 | 
			
		||||
 | 
			
		||||
    reader := this.reader
 | 
			
		||||
    kReader := strings.NewReader( Keyword )
 | 
			
		||||
 | 
			
		||||
    var b strings.Builder
 | 
			
		||||
    for {
 | 
			
		||||
        r, _, _err := reader.ReadRune()
 | 
			
		||||
        err = _err
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            if err == io.EOF {
 | 
			
		||||
                if 0 < b.Len() {
 | 
			
		||||
                    err = nil
 | 
			
		||||
                } else {
 | 
			
		||||
                    err = fmt.Errorf( "Nothing left to read" )
 | 
			
		||||
                    return
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            break
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if strings.ContainsRune( K_SPACES, r ) && b.Len() == 0 {
 | 
			
		||||
            continue
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        k, _, _err := kReader.ReadRune()
 | 
			
		||||
        if _err != nil {
 | 
			
		||||
            if _err != io.EOF {
 | 
			
		||||
                err = _err
 | 
			
		||||
            } else {
 | 
			
		||||
                err = nil
 | 
			
		||||
            }
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if k != r {
 | 
			
		||||
            err = fmt.Errorf(
 | 
			
		||||
                "Expected \"%s\", got \"%s\"",
 | 
			
		||||
                Keyword,
 | 
			
		||||
                this.ReadUntilNot( K_STATEMENT_CHARS, true, r ),
 | 
			
		||||
            )
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
        b.WriteRune( r )
 | 
			
		||||
    }
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ( this *Lexer ) ReadAlpha() ( s string, err error ) {
 | 
			
		||||
    reader := this.reader
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -116,4 +116,15 @@ func TestAlpha( t *testing.T ) {
 | 
			
		||||
            t.Errorf( "Expected error for %s, got %s", v, f )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    lexer.SetReader( strings.NewReader( "abcd efgh" ) )
 | 
			
		||||
    f, err := lexer.ReadAlpha()
 | 
			
		||||
    f, err = lexer.ReadAlpha()
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        t.Errorf( "Expected string for \"efgh\", got %s", err )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if f != "efgh" {
 | 
			
		||||
        t.Errorf( "Expected \"efgh\", got %s", f )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user