2019-11-18 22:44:24 -08:00
|
|
|
package shsh
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strings"
|
2019-11-21 19:58:28 -08:00
|
|
|
"unicode"
|
2019-11-18 22:44:24 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 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 int
|
|
|
|
|
const (
|
|
|
|
|
LIST_T parse_tag = iota
|
2019-11-21 20:32:00 -08:00
|
|
|
SYMBOL_T parse_tag = iota
|
2019-11-18 22:44:24 -08:00
|
|
|
OPERAND_T parse_tag = iota
|
|
|
|
|
OPERATION_T parse_tag = iota
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func Parse(arg *Token) {
|
2019-11-19 19:15:20 -08:00
|
|
|
switch arg.tag {
|
|
|
|
|
case LIST_T:
|
|
|
|
|
for i := arg; i; i = i.next {
|
|
|
|
|
Parse(i)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if list_is_operation(arg) {
|
|
|
|
|
arg.tag = OPERATION_T
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case OPERAND_T:
|
2019-11-21 20:32:00 -08:00
|
|
|
if string_is_symbol(arg._inner) {
|
|
|
|
|
arg.tag = SYMBOL_T
|
2019-11-19 19:15:20 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
;// TODO: Tag a parse error?
|
|
|
|
|
}
|
2019-11-18 22:44:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func string_delimiters_valid(arg string) bool {
|
2019-11-21 19:58:28 -08:00
|
|
|
delim := arg[0]
|
|
|
|
|
iter := 0
|
|
|
|
|
|
|
|
|
|
if delim != arg[len(arg) - 1] {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, r := range arg {
|
|
|
|
|
if delim == r {
|
|
|
|
|
iter += 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return iter == 2
|
2019-11-18 22:44:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func list_is_operation(arg *Token) bool {
|
2019-11-21 21:10:22 -08:00
|
|
|
// TODO: Rewrite after implementing a symbol table
|
|
|
|
|
//return ((*Token) arg._inner).tag == OPERATOR_T
|
2019-11-18 22:44:24 -08:00
|
|
|
}
|
|
|
|
|
|
2019-11-21 19:58:28 -08:00
|
|
|
// theres probly a way better way to do it.
|
2019-11-21 20:32:00 -08:00
|
|
|
func string_is_symbol(arg string) bool {
|
2019-11-21 19:58:28 -08:00
|
|
|
for _, r := range arg {
|
|
|
|
|
if !unicode.IsLetter(r) && r != '_' {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-11-18 22:44:24 -08:00
|
|
|
|
2019-11-21 19:58:28 -08:00
|
|
|
return true
|
2019-11-18 22:44:24 -08:00
|
|
|
}
|