SHS/pkg/shsh/parsers.go

74 lines
1.3 KiB
Go
Raw Normal View History

2019-11-18 22:44:24 -08:00
package shsh
import (
"strings"
"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 {
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 {
return ((*Token) arg._inner).tag == OPERATOR_T
2019-11-18 22:44:24 -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 {
for _, r := range arg {
if !unicode.IsLetter(r) && r != '_' {
return false
}
}
2019-11-18 22:44:24 -08:00
return true
2019-11-18 22:44:24 -08:00
}