2019-11-18 22:44:24 -08:00
|
|
|
// TODO: think about package names
|
|
|
|
|
// Should we have one for all our code?
|
|
|
|
|
package shsh
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 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
|
|
|
|
|
OPERAND_T parse_tag = iota
|
|
|
|
|
OPERATOR_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:
|
|
|
|
|
if string_is_operator(arg._inner) {
|
|
|
|
|
arg.tag = OPERATOR_T
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
;// TODO: Tag a parse error?
|
|
|
|
|
}
|
2019-11-18 22:44:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func string_delimiters_valid(arg string) bool {
|
2019-11-19 19:15:20 -08:00
|
|
|
// TODO: Enhance this function
|
|
|
|
|
go
|
2019-11-18 22:44:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func list_is_operation(arg *Token) bool {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func string_is_operator(arg string) bool {
|
|
|
|
|
|
|
|
|
|
}
|