func (buffer *lexBuffer) factor() *types.TreeNode { var node *types.TreeNode var err error switch buffer.token.TokenType { case types.NUM: node = newExpNode(types.ConstK, buffer.token.Lineno) if buffer.token.TokenType == types.NUM { node.Val, err = strconv.Atoi(buffer.token.TokenString) if err != nil { panic(err) } } buffer.match(types.NUM) case types.ID: node = newExpNode(types.IdK, buffer.token.Lineno) if buffer.token.TokenType == types.ID { node.Name = buffer.token.TokenString } buffer.match(types.ID) case types.STRING: node = newExpNode(types.StringK, buffer.token.Lineno) node.ValString = buffer.token.TokenString buffer.match(types.STRING) case types.LPAREN: buffer.match(types.LPAREN) node = buffer.exp() buffer.match(types.RPAREN) default: syntaxError(buffer.token) } return node }