updated code
This commit is contained in:
		@ -124,7 +124,70 @@ func (p *process_t) pop_context() (node *Cnode_t) {
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
stmt
 | 
			
		||||
 | 
			
		||||
	   text text bracket
 | 
			
		||||
		              stmt: text text
 | 
			
		||||
					  stmt: text TEXT
 | 
			
		||||
*/
 | 
			
		||||
func (interp *Interp) eval_atom_node(node *Cnode_t) (*string, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		p     process_t
 | 
			
		||||
		v     *string
 | 
			
		||||
		inode *Cnode_t
 | 
			
		||||
		err   error
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	p.interp = interp
 | 
			
		||||
 | 
			
		||||
	for node != nil {
 | 
			
		||||
		p.push_context(node)
 | 
			
		||||
		p.push_string_value("") // placeholder for return value
 | 
			
		||||
 | 
			
		||||
		for inode = node.child; inode != nil; inode = inode.next {
 | 
			
		||||
			switch inode.code {
 | 
			
		||||
			case CNODE_BRACKET:
 | 
			
		||||
				//p.push_context(inode)
 | 
			
		||||
				//p.push_string_value("")
 | 
			
		||||
				//node =
 | 
			
		||||
 | 
			
		||||
			case CNODE_TEXT:
 | 
			
		||||
 | 
			
		||||
				//fmt.Printf("XXXXXXXXXXXXXXXXXXXx[%s]\n", string(inode.token))
 | 
			
		||||
				err = p.push_string_value(string(inode.token))
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					goto oops
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fmt.Printf("CALLING\n")
 | 
			
		||||
		err = p.call()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			goto oops
 | 
			
		||||
		}
 | 
			
		||||
		if p.ctx.parent_ctx != nil {
 | 
			
		||||
			p.pop_context()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		node = node.next
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	v = (*string)(p.pop_value())
 | 
			
		||||
	p.pop_context()
 | 
			
		||||
	if p.ctx != nil {
 | 
			
		||||
		err = fmt.Errorf("internal error - dangling process context")
 | 
			
		||||
		goto oops
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return v, nil
 | 
			
		||||
 | 
			
		||||
oops:
 | 
			
		||||
	return nil, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (interp *Interp) eval_atom_node_old(node *Cnode_t) (*string, error) {
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		p   process_t
 | 
			
		||||
@ -186,11 +249,6 @@ func (interp *Interp) eval_atom_node(node *Cnode_t) (*string, error) {
 | 
			
		||||
				goto oops
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case CNODE_SEP:
 | 
			
		||||
			// skip
 | 
			
		||||
		case CNODE_EOL:
 | 
			
		||||
			// skip
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			err = fmt.Errorf("internal error - non-atom node - %d", node.code)
 | 
			
		||||
			goto oops
 | 
			
		||||
 | 
			
		||||
@ -392,7 +392,7 @@ func (inter *Interp) add_cnode_to_feed_struct(feed *feed_struct_t, cnode *Cnode_
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var feed_to_cnode_code_tab [11]cnode_code_t = [11]cnode_code_t{
 | 
			
		||||
	FEED_TOP:          CNODE_EOL, // this must never be used
 | 
			
		||||
	FEED_TOP:          CNODE_INVALID, // this must never be used
 | 
			
		||||
	FEED_INIT:         CNODE_INIT,
 | 
			
		||||
	FEED_BRACKET:      CNODE_BRACKET,
 | 
			
		||||
	FEED_BRACE:        CNODE_BRACE,
 | 
			
		||||
@ -400,9 +400,9 @@ var feed_to_cnode_code_tab [11]cnode_code_t = [11]cnode_code_t{
 | 
			
		||||
	FEED_DQUOTE:       CNODE_DQUOTE,
 | 
			
		||||
	FEED_DQUOTED_TEXT: CNODE_TEXT,
 | 
			
		||||
	FEED_DOLLAR:       CNODE_VAR,
 | 
			
		||||
	FEED_SEP:          CNODE_SEP,
 | 
			
		||||
	FEED_SEP:          CNODE_INVALID,
 | 
			
		||||
	FEED_WORD:         CNODE_TEXT,
 | 
			
		||||
	FEED_EOL:          CNODE_EOL,
 | 
			
		||||
	FEED_EOL:          CNODE_INVALID,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (interp *Interp) pop_feed_struct() *feed_struct_t {
 | 
			
		||||
@ -445,6 +445,9 @@ func (interp *Interp) pop_feed_struct() *feed_struct_t {
 | 
			
		||||
		parent.cnode_cont = false
 | 
			
		||||
	} else {
 | 
			
		||||
		cnode = &Cnode_t{code: feed_to_cnode_code_tab[feed.state], token: feed.token}
 | 
			
		||||
		if cnode.code == CNODE_INVALID {
 | 
			
		||||
			panic("internal error - CNODE INVALID encountered")
 | 
			
		||||
		}
 | 
			
		||||
		if cnode.code == CNODE_BRACKET || cnode.code == CNODE_BRACE || cnode.code == CNODE_INIT {
 | 
			
		||||
			// popping a container feed struct
 | 
			
		||||
			interp.finalize_feed_struct(feed, true)
 | 
			
		||||
@ -452,15 +455,7 @@ func (interp *Interp) pop_feed_struct() *feed_struct_t {
 | 
			
		||||
		} else if cnode.code == CNODE_DQUOTE {
 | 
			
		||||
			interp.finalize_feed_struct(feed, false)
 | 
			
		||||
			cnode.child = feed.cnode_first
 | 
			
		||||
		} /*else if cnode.code == CNODE_VAR {
 | 
			
		||||
			fmt.Printf(">>>>\n")
 | 
			
		||||
			interp.dump_cnodes(parent.cnode_first, true)
 | 
			
		||||
			fmt.Printf(">>>>\n")
 | 
			
		||||
			interp.dump_cnodes(parent.cnode_tmp_first, true)
 | 
			
		||||
			fmt.Printf(">>>>\n")
 | 
			
		||||
			interp.dump_cnodes(cnode, true)
 | 
			
		||||
 | 
			
		||||
		}*/
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// add the current cnode to the parent feed struct
 | 
			
		||||
		interp.add_cnode_to_feed_struct(parent, cnode)
 | 
			
		||||
 | 
			
		||||
@ -54,14 +54,13 @@ type call_frame_t struct {
 | 
			
		||||
type cnode_code_t int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	CNODE_INIT cnode_code_t = iota
 | 
			
		||||
	CNODE_INVALID cnode_code_t = iota
 | 
			
		||||
	CNODE_INIT
 | 
			
		||||
	CNODE_BRACKET
 | 
			
		||||
	CNODE_BRACE
 | 
			
		||||
	CNODE_DQUOTE
 | 
			
		||||
	CNODE_VAR
 | 
			
		||||
	CNODE_TEXT
 | 
			
		||||
	CNODE_SEP
 | 
			
		||||
	CNODE_EOL
 | 
			
		||||
	CNODE_STMT
 | 
			
		||||
	CNODE_JOIN // merge the two top elements off the stack
 | 
			
		||||
)
 | 
			
		||||
@ -329,12 +328,6 @@ func (interp *Interp) __dump_cnodes(node *Cnode_t, nl bool, tabs int) {
 | 
			
		||||
			// contained inside other containers, some escaping is required
 | 
			
		||||
			fmt.Printf("%s", string(node.token))
 | 
			
		||||
 | 
			
		||||
		case CNODE_SEP:
 | 
			
		||||
			fmt.Printf(" ")
 | 
			
		||||
 | 
			
		||||
		case CNODE_EOL:
 | 
			
		||||
			fmt.Printf("\n")
 | 
			
		||||
 | 
			
		||||
		case CNODE_JOIN:
 | 
			
		||||
			// do nothing
 | 
			
		||||
			//fmt.Printf("<M>")
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user