SHS/pkg/shsh/token.go

74 lines
1.5 KiB
Go

package token;
import (
"strings"
"bytes"
)
type operation func(Token) Token
/*
* LIST: a list of elements
* OPERAND: a string or number
* OPERATOR: an entry in a symtable
* OPERATION: a list starting with an operator
*/
type parse_tag enum {
LIST_T iota
OPERAND_T iota
OPERATOR_T iota
OPERATION_T iota
}
type Token struct {
Token *next
interface{} _inner
}
func lex(string input) Token {
ret := new(Token)
iter := &ret
var tok strings.Builder
iter_alloced := false
for pos, char := range input {
switch char {
case '\'', '\"', '`':
// parse new token
fallthrough
case ' ', '\t', '\n', '\f', '\r':
*iter = new(Token)
(*iter)->_inner = tok.String()
iter_alloced = true
case '(':
// match paren
*iter = new(Token)
(*iter)->_inner = lex(tok.String())
iter_alloced = true
case ')':
// SHOULDNT HAPPEN
default:
tok.WriteRune(char)
buf_is_dirty = true
}
if iter_alloced {
iter = &(*iter)->next
iter_alloced = false
// clear buffer
}
}
}
func parse(Token *arg) {
// if operand determine if operator
// determine operator precense in symbol table
// Determine if a list is an operation or a list
}
func eval(Token *tree) Token* {
// Find operations
// Simplify operations deepest first
// return tree of final Tokens
}