Some early lexer ideas
This commit is contained in:
parent
0acbda9a7a
commit
c9ecbdde08
51
mmql/definitions.go
Normal file
51
mmql/definitions.go
Normal file
@ -0,0 +1,51 @@
|
||||
package mmql
|
||||
|
||||
type TokenType int
|
||||
|
||||
type Token struct {
|
||||
Type TokenType
|
||||
Value string
|
||||
}
|
||||
|
||||
const (
|
||||
K_SPACES = "\t\n\r "
|
||||
K_BRACKETS = "()[]{}"
|
||||
K_QUOTES = "'\"`"
|
||||
)
|
||||
|
||||
const (
|
||||
UnknownToken TokenType = iota
|
||||
KeywordToken
|
||||
BracketToken
|
||||
SquareBracketToken
|
||||
CurlyBracketToken
|
||||
SingleQuote
|
||||
DoubleQuote
|
||||
AccuteAccentQuote
|
||||
)
|
||||
|
||||
var KEYWORDS = []string {
|
||||
"ANYWHERE",
|
||||
"BOUGHT",
|
||||
"BUY",
|
||||
"CREATE",
|
||||
"EVERY",
|
||||
"EXCHANGE",
|
||||
"FOR",
|
||||
"FROM",
|
||||
"GET",
|
||||
"LIMIT",
|
||||
"LIST",
|
||||
"OF",
|
||||
"SELL",
|
||||
"SOLD",
|
||||
"TRIGGER",
|
||||
"TRIGGERS",
|
||||
"TYPE",
|
||||
"UPDATE",
|
||||
"WITH",
|
||||
}
|
||||
|
||||
var STATEMENTS = map[string] func() ( IStatement, error ) {
|
||||
"BUY": _buyStatement,
|
||||
}
|
14
mmql/lexer.go
Normal file
14
mmql/lexer.go
Normal file
@ -0,0 +1,14 @@
|
||||
package mmql
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Lexer struct {
|
||||
expect TokenType
|
||||
}
|
||||
|
||||
func ( this *Lexer ) Parse( line string ) {
|
||||
|
||||
for i, r := range line {
|
||||
fmt.Printf( "%d: %s\n", i, string( r ) )
|
||||
}
|
||||
}
|
17
mmql/lexer_test.go
Normal file
17
mmql/lexer_test.go
Normal file
@ -0,0 +1,17 @@
|
||||
package mmql
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestParse( t *testing.T ) {
|
||||
lexer := Lexer{}
|
||||
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"
|
||||
` )
|
||||
|
||||
}
|
8
mmql/statements.go
Normal file
8
mmql/statements.go
Normal file
@ -0,0 +1,8 @@
|
||||
package mmql
|
||||
|
||||
type IStatement interface {
|
||||
}
|
||||
|
||||
type ActionStatement struct {
|
||||
IStatement
|
||||
}
|
30
mmql/stmt_buy.go
Normal file
30
mmql/stmt_buy.go
Normal file
@ -0,0 +1,30 @@
|
||||
package mmql
|
||||
|
||||
/*
|
||||
EXPECT: BUY
|
||||
THEN EXPECT: [AmountType] OF [ProductType]
|
||||
THEN EXPECT: FOR [AmountType]
|
||||
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() ( IStatement, error ) {
|
||||
a := ActionStatement{}
|
||||
var b IStatement = a
|
||||
return b, nil
|
||||
}
|
||||
/*
|
||||
func _buyStatement( lexer *Lexer ) ( ActionStatement, error ) {
|
||||
|
||||
token := lexer.GetToken()
|
||||
if token.Type == KeywordToken && token.Value == "BUY" {
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
*/
|
Loading…
Reference in New Issue
Block a user