Some basic structures

This commit is contained in:
2022-10-22 00:03:06 +08:00
parent 31f6e7165d
commit bbde3e80f7
10 changed files with 544 additions and 228 deletions

View File

@@ -0,0 +1,32 @@
package actions
import (
// "fmt"
engine "github.com/tgckpg/mmqlengine/mmql/engine"
stmtd "github.com/tgckpg/mmqlengine/mmql/statements"
)
/*
EXPECT: [Number] [Units]
OR
EXPECT: [FUNCTION]( ...params )
*/
func AmountStatement( lexer *engine.Lexer ) ( istmt stmtd.IStatement, err error ) {
stmt := stmtd.AmountStatement{}
val, err := lexer.ReadDecimal()
if err != nil {
return
}
stmt.Value = val
unit, err := lexer.ReadAlpha()
if err != nil {
return
}
stmt.Unit = unit
istmt = stmt
return
}

View File

@@ -0,0 +1,41 @@
package actions
import (
engine "github.com/tgckpg/mmqlengine/mmql/engine"
stmtd "github.com/tgckpg/mmqlengine/mmql/statements"
)
/*
EXPECT: BUY
THEN EXPECT: [AmountStatement] OF [ProductStatement]
THEN EXPECT: FOR [AmountStatement]
THEN EXPECT: FROM [ExchangeType]
THEN OPT EXPECT: [ExchangeType]
THEN OPT EXPECT: [AND|OR]
THEN EXPECT: [ActionExpression]
THEN OPT EXPECT: FOR EVERY
THEN EXPECT: [AmountType] OF [ProductType]
THEN EXPECT: [SOLD|BOUGHT] FROM [ExchangeType]
*/
func BuyStatement( lexer *engine.Lexer ) ( stmtd.IStatement, error ) {
orderStmt := stmtd.OrderStatement{}
orderStmt.Action = "BUY"
readAmount := engine.LexerExpect{
Statements: true,
Keywords: false,
Brackets: false,
Quotes: false,
Key: "AMOUNT",
}
amountStmt, err := lexer.ReadStatement( &readAmount )
if err != nil {
return nil, err
}
orderStmt.For( amountStmt )
var istmt stmtd.IStatement = orderStmt
return istmt, err
}

View File

@@ -0,0 +1,30 @@
package actions
import (
// "fmt"
"testing"
engine "github.com/tgckpg/mmqlengine/mmql/engine"
stmtd "github.com/tgckpg/mmqlengine/mmql/statements"
)
func TestBuyStatement( t *testing.T ) {
lexer := engine.Lexer{}
supportedStmts := map[string] func( *engine.Lexer ) ( stmtd.IStatement, error ) {
"BUY": BuyStatement,
"AMOUNT": AmountStatement,
}
lexer.SupportedStmts = &supportedStmts
_, err := lexer.Parse( `
BUY 1 SHARES OF BTC_ETF
FOR 10 USD
FROM "MyBrokerAccount"
WITH LIMIT OF PURCHASING_POWER( "MyBrokerAccount", "QQQ" )
FOR EVERY
1 BTC OF USD_BTC SOLD
FROM "CoinBase"
` )
if err != nil {
t.Error( err )
}
}

37
mmql/statements/types.go Normal file
View File

@@ -0,0 +1,37 @@
package statements
type IStatement interface { }
type RawStatement struct {
IStatement
Value string
}
type QuotedValue struct {
IStatement
RawStatement *RawStatement
Quote string
}
type BracketedValue struct {
IStatement
RawStatement *RawStatement
Brackets string
}
type AmountStatement struct {
IStatement
Value float64
Unit string
}
type IActionStatement interface { }
type OrderStatement struct {
IStatement
IActionStatement
Action string
}
func ( this *OrderStatement ) For( stmt IStatement ) {
}