Drafting ProductStatement
This commit is contained in:
parent
bbde3e80f7
commit
36faffe882
@ -135,6 +135,54 @@ func ( this *Lexer ) ReadDecimal() ( f float64, err error ) {
|
|||||||
return
|
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 ) {
|
func ( this *Lexer ) ReadAlpha() ( s string, err error ) {
|
||||||
reader := this.reader
|
reader := this.reader
|
||||||
|
|
||||||
|
@ -116,4 +116,15 @@ func TestAlpha( t *testing.T ) {
|
|||||||
t.Errorf( "Expected error for %s, got %s", v, f )
|
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 )
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,10 +18,11 @@ THEN OPT EXPECT: FOR EVERY
|
|||||||
THEN EXPECT: [SOLD|BOUGHT] FROM [ExchangeType]
|
THEN EXPECT: [SOLD|BOUGHT] FROM [ExchangeType]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
func BuyStatement( lexer *engine.Lexer ) ( stmtd.IStatement, error ) {
|
func BuyStatement( lexer *engine.Lexer ) ( istmt stmtd.IStatement, err error ) {
|
||||||
orderStmt := stmtd.OrderStatement{}
|
orderStmt := stmtd.OrderStatement{}
|
||||||
orderStmt.Action = "BUY"
|
orderStmt.Action = "BUY"
|
||||||
|
|
||||||
|
// AmountStatement
|
||||||
readAmount := engine.LexerExpect{
|
readAmount := engine.LexerExpect{
|
||||||
Statements: true,
|
Statements: true,
|
||||||
Keywords: false,
|
Keywords: false,
|
||||||
@ -32,10 +33,30 @@ func BuyStatement( lexer *engine.Lexer ) ( stmtd.IStatement, error ) {
|
|||||||
|
|
||||||
amountStmt, err := lexer.ReadStatement( &readAmount )
|
amountStmt, err := lexer.ReadStatement( &readAmount )
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return
|
||||||
}
|
}
|
||||||
orderStmt.For( amountStmt )
|
orderStmt.For( amountStmt )
|
||||||
|
|
||||||
var istmt stmtd.IStatement = orderStmt
|
// OF
|
||||||
return istmt, err
|
err = lexer.ReadKeyword( "OF" )
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProductStatement
|
||||||
|
readProduct := engine.LexerExpect{
|
||||||
|
Statements: true,
|
||||||
|
Keywords: false,
|
||||||
|
Brackets: false,
|
||||||
|
Quotes: false,
|
||||||
|
Key: "PRODUCT",
|
||||||
|
}
|
||||||
|
productStmt, err := lexer.ReadStatement( &readProduct )
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
orderStmt.Product( productStmt )
|
||||||
|
|
||||||
|
istmt = orderStmt
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ func TestBuyStatement( t *testing.T ) {
|
|||||||
supportedStmts := map[string] func( *engine.Lexer ) ( stmtd.IStatement, error ) {
|
supportedStmts := map[string] func( *engine.Lexer ) ( stmtd.IStatement, error ) {
|
||||||
"BUY": BuyStatement,
|
"BUY": BuyStatement,
|
||||||
"AMOUNT": AmountStatement,
|
"AMOUNT": AmountStatement,
|
||||||
|
"PRODUCT": ProductStatement,
|
||||||
}
|
}
|
||||||
lexer.SupportedStmts = &supportedStmts
|
lexer.SupportedStmts = &supportedStmts
|
||||||
|
|
||||||
|
26
mmql/statements/actions/product.go
Normal file
26
mmql/statements/actions/product.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package actions
|
||||||
|
|
||||||
|
import (
|
||||||
|
// "fmt"
|
||||||
|
engine "github.com/tgckpg/mmqlengine/mmql/engine"
|
||||||
|
stmtd "github.com/tgckpg/mmqlengine/mmql/statements"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
EXPECT: [NAME]
|
||||||
|
OR
|
||||||
|
EXPECT: [FUNCTION]( ...params )
|
||||||
|
*/
|
||||||
|
|
||||||
|
func ProductStatement( lexer *engine.Lexer ) ( istmt stmtd.IStatement, err error ) {
|
||||||
|
stmt := stmtd.ProductStatement{}
|
||||||
|
|
||||||
|
name, err := lexer.ReadAlpha()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
stmt.Name = name
|
||||||
|
|
||||||
|
istmt = stmt
|
||||||
|
return
|
||||||
|
}
|
@ -25,8 +25,16 @@ type AmountStatement struct {
|
|||||||
Unit string
|
Unit string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ProductStatement struct {
|
||||||
|
IStatement
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
type IActionStatement interface { }
|
type IActionStatement interface { }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type OrderStatement struct {
|
type OrderStatement struct {
|
||||||
IStatement
|
IStatement
|
||||||
IActionStatement
|
IActionStatement
|
||||||
@ -35,3 +43,6 @@ type OrderStatement struct {
|
|||||||
|
|
||||||
func ( this *OrderStatement ) For( stmt IStatement ) {
|
func ( this *OrderStatement ) For( stmt IStatement ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ( this *OrderStatement ) Product( stmt IStatement ) {
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user